本文共 3951 字,大约阅读时间需要 13 分钟。
在进行代码接入前,需在微信后台填写授权回调域名。此域名必须经过ICP备案,以确保合法性。
trade_type=MWEB。mweb_url调起支付中间页。appid:微信公众号ID。mch_id:微信商户账户号。nonce_str:随机字符串,不超过32位。sign:签名,需通过特定方式生成。body:商品描述。out_trade_no:商户订单号,不超过32位。total_fee:总金额,以分为单位。spbill_create_ip:用户支付时的IP地址。notify_url:异步通知回调地址,需为可直接访问的URL,无携带参数。trade_type:交易类型,H5支付对应MWEB。k1=v1&k2=v2&…的字符串。function genSign($params, $key) { foreach ($params as $k => $v) { if (!$v) { unset($params[$k]); } } ksort($params); $paramStr = ''; foreach ($params as $k => $v) { $paramStr .= $k . '=' . $v . '&'; } $paramStr .= 'key=' . $key; $sign = strtoupper(md5($paramStr)); return $sign;} 将参数转为XML数据后,通过HTTPS或HTTP协议发送请求。
function array_to_xml($params) { if (!is_array($params) || count($params) <= 0) { return false; } $xml = ' '; foreach ($params as $key => $val) { if (is_numeric($val)) { $xml .= '<' . $key . '>' . $val . ' '; } else { $xml .= '<' . $key . '> '; } } $xml .= ' '; return $xml;} $ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $params);$return = curl_exec($ch);curl_close($ch);return $return;
微信返回XML数据,解析后可获得支付状态和相关参数。
SUCCESS OK wxdded766660f9b840 1516216351 100 2DUN2i2pGnlC6vDi 95CEA831D598299097A32D8FEEC6BDEF SUCCESS wx22194530678545eb3713f2f10724143329 MWEB https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx22194530678545eb3713f2f10724143329&package=87106983
return_code:SUCCESS表示支付成功。mweb_url:支付跳转页URL,客户端可直接调用。通过mweb_url获取深度链接deepLink,客户端可直接调起支付。
function getDeeplink($url, $ip) { $headers = array("X-FORWARDED-FOR:$ip", "CLIENT-IP:$ip"); ob_start(); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_REFERER, "pay.o9di.cn"); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 6.0.1; OPPO R11s Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36'); curl_exec($ch); curl_close($ch); $out = ob_get_contents(); ob_clean(); preg_match('/weixin:\/\/wap.*/', $out, $str); if ($str) { return substr($str[0], 0, strlen($str[0]) - 1); } else { return ''; }} 在notify_url回调地址接收支付结果。
function notify() { $str_Post = $GLOBALS["HTTP_RAW_POST_DATA"]; libxml_disable_entity_loader(true); $postObj = simplexml_load_string($str_Post, 'SimpleXMLElement', LIBXML_NOCDATA); $postObj = json_encode($postObj); $postObj = json_decode($postObj, true); $out_trade_no = trim($postObj["out_trade_no"]); if ($postObj["result_code"] == 'SUCCESS' && $postObj["return_code"] == 'SUCCESS') { // 更新订单状态等相关操作 }} 通过getClientIp函数获取用户端IP地址。
function getClientIp() { $cip = 'unknown'; if ($_SERVER['REMOTE_ADDR']) { $cip = $_SERVER['REMOTE_ADDR']; } elseif (getenv($_SERVER['REMOTE_ADDR'])) { $cip = getenv($_SERVER['REMOTE_ADDR']); } return $cip;} 转载地址:http://cstfk.baihongyu.com/