技术饭
app支付接口、wap支付接口实现原理解析(支付宝、微信、连连支付、银联支付)
最近因为公司项目要做支付功能,所以就一直在研究支付接口包括(支付宝、微信、连连支付、银联支付),由于支付接口为了安全性有各种验证,所以看起来比较繁琐,但是认真剖析一下也只有: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呢也会多一些。


文明上网理性发言!