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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值