公司最近申请到了微信h5支付的资格,这个功能以前只对合作商家开放,现在都可以申请了,下面来讲解一下微信h5支付的流程
第一步
微信的所有支付第一步都是 统一下单 参数可在官方文档查看 微信H5支付文档
用户点击微信支付,此时后台根据用户的订单信息,向微信发送统一下单的请求
//微信h5支付 $param['appid'] = "xxxxxxxxxxxx";//微信支付的appid $param['body'] = "微信支付body";//微信支付的商品描述 $param['mch_id'] = "xxxxxxxxx";//微信支付的mch_id $param['nonce_str'] = $order_arr['data']['OrderCode'];//随机字符串 $param['notify_url'] = "http://xxxx.xxxx.com/wx_h5_callback.php";//回调地址 这个地址需要微信支付后台配置白名单 上限貌似是五个 $param['out_trade_no'] = $order_arr['data']['OrderCode'];//商户订单号 $param['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'];//终端ip $param['total_fee'] = $price*100;//价格 单位分 $param['trade_type'] = "MWEB";//交易类型 h5支付的交易类型必须为MWEB $param['scene_info'] = '{"h5_info": {"type":"Wap","wap_url": "http://xxx.xxxxxx.com","wap_name": "网站名称"}}';//场景信息 //按照微信规则生成签名 $sign = makeWXsign($param,$key);//key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 //拼接xml数据 $send = "<xml> <appid>{$param['appid']}</appid> <attach>{$param['attach']}</attach> <body>{$param['body']}</body> <mch_id>{$param['mch_id']}</mch_id> <nonce_str>{$param['nonce_str']}</nonce_str> <notify_url>{$param['notify_url']}</notify_url> <out_trade_no>{$param['out_trade_no']}</out_trade_no> <spbill_create_ip>{$param['spbill_create_ip']}</spbill_create_ip> <total_fee>{$param['total_fee']}</total_fee> <trade_type>{$param['trade_type']}</trade_type> <scene_info>{$param['scene_info']}</scene_info> <sign>{$sign}</sign> </xml>"; //向微信发送请求 $result=postXmlCurl($send,"https://api.mch.weixin.qq.com/pay/unifiedorder"); /*********过程中用到的两个函数***********/ //微信支付签名生成函数 function makeWXQM($arr,$key){ ksort($arr); $str=''; foreach($arr as $k=>$v){ $str.=$k.'='.$v.'&'; } $str.='key='.$key; return strtoupper(md5($str)); } //给微信发送请求函数 function postXmlCurl($xml, $url, $second = 30) { $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOPT_TIMEOUT, $second); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验 //设置header curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //post提交方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); //运行curl $data = curl_exec($ch); //返回结果 if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); die("curl出错,错误码:$error"); } }
2 调起支付
第一步发送请求如果成功的话$result就是微信返回给我们的有用的数据,接下来用这个数据来调起支付
$return_arr = xml_to_array($result); //设置支付成功跳转地址 $return_url = urlencode("http://xxxx.xxxx.com");//支付完成后你要跳转的地址 //跳转此链接拉起微信支付 header("location:".$return_arr['mweb_url']."&redirect_url={$return_url}");//拉起微信支付链接(并且附上$return_url) exit; /****用到的函数*****/ xml_to_array($xml){ //禁止引用外部xml实体 libxml_disable_entity_loader(true); $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $values; }
此时手机上应该已经唤醒微信进行支付了 接下来看看支付完成后的处理
3 支付回调
根据第一步我们设置的回调地址,支付完成后微信会给我们的回调地址发送支付成功或者失败的信息,此时我们需要修改相应的订单状态
此处的逻辑根据自己的需求不同而不同,这里就不列举了,需要注意的一点是就微信异步通知发送的xml数据,回调地址解析xml数据并且处理就可以了
ps:微信h5支付只适用于手机端非微信浏览器,在pc端或者手机微信内是无法拉起支付的,大家在开发过程中有问题请在此留言或者联系我的邮箱
个人原创内容 转载请注明出处