php支付宝app支付报错,字节跳动小程序,支付宝支付报错,确认订单失败,或没有反应...

项目要求接入头条小程序支付,踩坑了两天,期间各种在论坛各种求解答,最终也没有给出想要的解释答案信息;

头条支付:头条后端统一下单--------调用支付宝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 = 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'

.'&notify_url='.urlencode($notify_url)

.'&sign='.urlencode($alisign)

.'&sign_type=RSA2&timestamp='.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=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 = res.data.data;//返回的参数信息

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);

}

})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值