技术饭

app支付接口、wap支付接口实现原理解析(支付宝、微信、连连支付、银联支付)

copylian    0 评论    17044 浏览    2017.05.04

最近因为公司项目要做支付功能,所以就一直在研究支付接口包括(支付宝、微信、连连支付、银联支付),由于支付接口为了安全性有各种验证,所以看起来比较繁琐,但是认真剖析一下也只有:1、下订单;2、发送数据给第三方支付接口;3、同步回调与异步回调处理数据。

那么今天我们探讨的问题就是支付接口的一些注意事项:

1、支付宝

网页:需要先把商户的订单数据传送给支付宝,建立请求,然后把支付宝返回的数据进行组装进行网页跳转

//建立请求
$alipaySubmit = new AlipaySubmit($this->alipay_config);
$html_text = $alipaySubmit->buildRequestHttp($para_token);

//URLDECODE返回的信息
$html_text = urldecode($html_text);
//解析远程模拟提交后返回的信息
$para_html_text = $alipaySubmit->parseResponse($html_text);
//获取request_token$request_token = $para_html_text['request_token'];
//业务详细$req_data = '<auth_and_execute_req><request_token>' . $request_token . '</request_token></auth_and_execute_req>';
//构造要请求的参数数组,无需改动
$parameter = array(     
      "service" => "alipay.wap.auth.authAndExecute",     
      "partner" => trim($this->alipay_config['partner']),     
      "sec_id" => trim($this->alipay_config['sign_type']),     
      "format"   => $this->format,    
      "v"    => $this->v,     
      "req_id"   => $this->req_id,      
      "req_data" => $req_data,      
      "_input_charset"   => trim(strtolower($this->alipay_config['input_charset']))
 );  
 
 //建立请求 
 $alipaySubmit = new AlipaySubmit($this->alipay_config); 
 $html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '正在跳转支付页面...');
 $html_text='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">     
 <html>     
 <head>        
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">        
 <title>支付宝即时到账交易接口接口</title>     
 </head><body>'.$html_text.'</body>     
 </html>';

App:只需要组装成拼接成相应字符串即可,然后把数据返回给IOS或安卓

//参数排序+拼接
$unsign_str =$this->createLinkstring_two($this->argSort($data));
//签名$sign =$this->rsaSign($unsign_str, $rsa_path);
//需要进行utf8格式转换$sign = urlencode(mb_convert_encoding($sign, "UTF-8"));
//组合最终参数$jsonParams= $unsign_str . "&sign=\"" . $sign . "\"&sign_type=\"RSA\"";
//返回数据return $jsonParams;

异步同步:需要注意的是回调验签的时候需要把没有用的参数删除,不然会报签名错误!app只需要设置异步即可。


2、微信

网页jsapi:需要注意的点是jsapi支付是基于微信浏览器的,同时需要配置好公众号的支付设置以及安全域名等,一定要区分app支付的appId与公众号支付的appId是否相同

App:同支付宝一样需要组装相应的字符串给IOS或者安卓处理!


异步同步:网页版有同步与异步,app只需要设置异步即可。


3、连连支付(认证版)

网页:认证版是一定要传递用户的姓名跟身份证号,对于 分控参数 要进行一次转义就好否则会报错。

App:同支付宝一样需要组装相应的字符串给IOS或者安卓处理,认证版是一定要传递用户的姓名跟身份证号,对于 分控参数 要进行一次转义就好否则会报错。


异步同步:网页版有同步与异步,app只需要设置异步即可。在回调的时候要注意一下数据处理


回调验签成功支付执行的JSON类有点小问题
$json = new JSON;
$res_data = $_POST["res_data"];

//连连支付支付单号
$oid_paybill = $json->decode($res_data)->{'oid_paybill'};
//商户订单号
$no_order = $json->decode($res_data)->{'no_order'};
//支付结果
$result_pay =  $json->decode($res_data)->{'result_pay'};

这里的deode方法解析时出了问题,解决方法是修改llpay_cls_json.php大概130行,把stripslashes改成htmlspecialchars_decode

if ( function_exists('json_decode'))
{
    //return $this->addslashes_deep_obj(json_decode(stripslashes($text),$type));
    //解决返回json问题
    return $this->addslashes_deep_obj(json_decode(htmlspecialchars_decode($text),$type));
}


4、银联支付

同上银联支付因为有官方demo所以直接看官方demo就没太大问题。

总结:总体而言对于支付接口的基本流程就是:商户发起请求,然后第三方支付接口返回数据;商户再次提交数据,处理异步与同步操作。但经过测试微信支付接口坑会比较多些,所以要特别注意,至于连连支付属于小型的支付接口bug呢也会多一些。

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!

文明上网理性发言!

  • 还没有评论,沙发等你来抢