php数据格式处理|字节跳动小程序,支付宝支付报错,确认订单失败,或没有反应
项目要求接入头条小程序支付,踩坑了两天,期间各种在论坛各种求解答,最终也没有给出想要的解释答案信息;
头条支付:头条后端统一下单--------调用支付宝app sdk 生成支付url链接------tt.requestPayment 开启支付操作
关于签名:1、统一下单签名:根据头条文档必填项,按照字母排列顺序进行&链接起来,签名字符串需要加上,申请支付头条返回的app_secret一起签名,然后md5操作一下,然后post网关,就可以获取到头条内部订单号,如果碰到4004---外部用户ex..uid不一致错误,需要及时更换你自己的订单号重新请求一次,因为订单有时效性,同一个内部订单与openid只能使用一次,多次不同的openid就会报错;
2、支付宝app ,查看支付宝支付的文档,网上有非常详细的资料,并且官方提供了sdk调用;生成url之后需要在支付宝的测试demo上进行模拟支付,如果调起失败,无法支付,一定要进行测试,及时避免掉这个问题
3、关于前端调用(搞了半天才弄明白错误的原因):碰到的错误有调用无反应、真机调试报错“确认订单号错误”,模拟器没有办法调用支付宝app支付,真机模拟报错,猜测原因,自己碰到的问题是因为同一个订单号使用了多次,返回的数据都是对的,就是无法支付,是因为你发送的过去的统一下单的订单号,不正确引起的,只需要更换内部订单号就可以调用成功;
案例:
public function test(){
$order_id = '3461';
//自己的订单号,在自己的系统里面
$openid = I('openid','','trim');
$notify_url = '.....';
//回调的url地址信息
$amount = 1;
$secret = '你的salt头条返回用于签名';
//处理今日头条后端统一下单申请处理
$biz_content = array(
'out_order_no' => $order_id,
'uid' => $openid,
'merchant_id' => 'xxxx',
'total_amount' =>$amount * 100,
'currency' => 'CNY',
'subject' => '描述',
'body' => '描述',
'trade_time' => NOW_TIME,
'valid_time' => '60',
'notify_url' => $notify_url,
'risk_info' => '144.114.114.144',
);
$biz_content = json_encode($biz_content);
$data['app_id'] = 'xxxxx';
$data['biz_content'] = $biz_content;
$data['charset'] = 'utf-8';
$data['method'] = 'tp.trade.create';
$data['sign_type'] = 'MD5';
$data['timestamp'] = NOW_TIME;
$data['version'] = '1.0';
ksort($data);
$var = '';
//处理的签名信息
foreach($data as $key => $value){
$var .= $key.'='.$value.'&';
}
$var = trim($var,'&');
$c = $var.$secret;
$data['sign'] = MD5($c);
ksort($data);
$url = 'https://tp-pay.snssdk.com/gateway';
$curl= new \Org\Net\Curl();
$re = $curl->post($url,$data);
$re = json_decode($re,true);
$re = $re['response'];
if($re['code'] == '10000'){
$trade_no = $re['trade_no'];
}else{
$this->ajaxReturn(array('errcode'=>4,'msg'=>'支付订单统一下单失败'));
}
######处理后端统一下单结束#####
########前端调用测试组装数据#########
require_once ( VENDOR_PATH."../../AopClient.php");
//sdk引用地址
$aop = new \AopClient();
$alipay_config = array();
//自己的支付宝公钥、私钥内容
$aop->appId =‘.................’;
$aop->rsaPrivateKey =$alipay_config['private_key'];
$aop->alipayrsaPublicKey = $alipay_config['public_key'];
$aop->signType = 'RSA2';
$out_trade_no = $order_id;
//组参完成
$biz_content_c = json_encode(array('subject'=>'...','out_trade_no'=>$order_id,'timeout_express'=>'30m',
'total_amount'=>$amount,'product_code'=>'QUICK_MSECURITY_PAY'));
$ali_data = https://www.it610.com/article/array();
$ali_data['app_id'] = 'xxxx';
$ali_data['biz_content'] = $biz_content_c;
$ali_data['charset'] = 'utf-8';
$ali_data['format'] = 'JSON';
$ali_data['sign_type'] = 'RSA2';
$ali_data['method'] = 'alipay.trade.app.pay';
$ali_data['timestamp'] = date('Y-m-d H:i:s');
$ali_data['version'] = '1.0';
$ali_data['notify_url'] = $notify_url;
$alisign = $aop->rsaSign($ali_data,'RSA2');
$urls = 'app_id=xxxxx'
.'&biz_content='.urlencode($biz_content_c)
.'&charset=utf-8&format=JSON&method=alipay.trade.app.pay'
.'¬ify_url='.urlencode($notify_url)
.'&sign='.urlencode($alisign)
.'&sign_type=RSA2×tamp='.urlencode(date('Y-m-d H:i:s')).'&version=1.0';
########支付宝app 预支付结束#########
//组装前端支付开始
$res['app_id'] = 'xxx';
// test
$res['method'] = 'tp.trade.confirm';
$res['sign_type'] = 'MD5';
$res["uid"]=$openid;
$res["total_amount"]=$amount*100;
$res['timestamp'] = time();
$res['pay_channel'] = "ALIPAY_NO_SIGN";
$res["pay_type"] = "ALIPAY_APP";
$res["trade_no"]= $trade_no;
$res["merchant_id"]= 'xxxx';
$res["risk_info"]= get_client_ip();
$res["uid"]=$openid;
$res["params"]=json_encode(array("url" =>$urls));
$res['url'] =$urls;
$signKeys=array("app_id","sign_type","timestamp","trade_no","merchant_id","uid","total_amount","params");
$signData=https://www.it610.com/article/array();
foreach ($signKeys as $v) {
$signData[$v] = $res[$v];
}
ksort($signData);
$var = '';
foreach($signData as $key => $value){
$var .= $key.'='.$value.'&';
}
$var = trim($var,'&');
$res['sign'] = MD5($var . $secret);
$this->ajaxReturn(array('errcode'=>0,'data'=>$res));
}
小程序前端部分
ttdata = https://www.it610.com/article/res.data.data;
//返回的参数信息
【php数据格式处理|字节跳动小程序,支付宝支付报错,确认订单失败,或没有反应】tt.requestPayment({
data: {
app_id: ttdata .app_id,
method: 'tp.trade.confirm',
sign: obj.sign,
sign_type: 'MD5',
timestamp: ttdata .timestamp.toString(),
trade_no: ttdata .trade_no,
merchant_id: ttdata .merchant_id,
uid: obj.uid,
total_amount: ttdata .total_amount,
pay_channel: 'ALIPAY_NO_SIGN',
pay_type: 'ALIPAY_APP',
risk_info: "{'ip':'" + ttdata .risk_info + "'}",
params: JSON.stringify({
url: ttdata .url
}),
return_url: 'xxxxx',
show_url: 'xxxx',
},
success(suc) {
console.log(suc);
},
fail(err) {
console.log(err);
}
})
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- thinkphp|thinkphp 3.2 如何调用第三方类库
- CGI,FastCGI,PHP-CGI与PHP-FPM
- 视频转换器哪种好用()
- 使用协程爬取网页,计算网页数据大小
- Java|Java基础——数组
- Python数据分析(一)(Matplotlib使用)
- Jsr303做前端数据校验
- Spark|Spark 数据倾斜及其解决方案
- 数据库设计与优化