当前位置: 首页 > 后端技术 > PHP

PHP如何实现微信H5支付?

时间:2023-03-29 16:49:30 PHP

开发前配置代码接入前,需要在微信后台填写授权回调域名。该域名必须经过ICP备案开发流程。下单时,用户选择微信支付商户进行业务逻辑处理,调用微信统一下单接口,微信H5交易类型为:trade_type=MWEB调用下单接口成功后,微信会返回支付重定向等相关参数URL,商户会通过参数mweb_url调用支付中间页面。在中间页面,微信会验证H5权限。向商户发送异步结果通知。正式开发并启动微信支付。请求微信统一下单接口只需要必要的参数。接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder接口请求参数appid:微信iDmch_id:账号nonce_str:随机字符串,不超过32位sign:签名正文:商品描述out_trade_no:商户订单号,不超过32位total_fee:总金额,单位为分spbill_create_ip:客户端请求支付时IPnotify_url:异步通知回调地址,必须可直接访问,不能携带参数trade_type:交易类型,如H5为MWEBorabove,是H5支付订单签名生成需要的参数生成签名涉及的参数必须是非空参数按照ASCII码从小到大排序,参数名区分大小写。根据上面的规则,将参数拼接成一个字符串如k1=v1&k2=v2....将上一步得到的字符串用一个key拼接,如k1=v1&k2=v2&key=192006250b4c09247ec02e用MD5加密最后的字符串并转为大写,即为最终的符号值代码:/***创建签名*@paramarray$params请求参数*@paramstring$key秘钥*/publicfunctiongenSign($params,$key){foreach($paramsas$k=>$v){if(!$v){unset($params[$k]);}}ksort($参数);$paramStr='';foreach($paramsas$k=>$v){$paramStr=$paramStr。$k。'='。$v。'&';}$paramStr=$paramStr。'key='.$key;$sign=strtoupper(md5($paramStr));返回$符号;}发起请求将参数转换为XML数据,再发起请求将数组转换为XML代码:/***将数组转换为XML*@paramarray$params支付请求参数*/publicfunctionarray_to_xml($params){if(!is_array($params)||count($params)<=0){返回假;}$xml="";foreach($paramsas$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,$参数);$return=curl_exec($ch);curl_close($ch);返回$return;微信返回XML数据:return_code为SUCCESS表示支付请求成功;mweb_url就是支付跳转页面。此时客户端可以通过mweb_url调用微信支付中间页面。获取微信返回的mweb_url参数后,可以进一步获取服务端的deepLink代码:/***获取微信支付中间页deepLink参数*@paramstring$url微信返回的mweb_url*@paramstring$ip客户端IP*/publicfunctiongetDeeplink(string$url,string$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;Android6.0.1;OPPOR11sBuild/MMB29M;wv)AppleWebKit/537.36(KHTML,likeGecko)Version/4.0Chrome/55.0.2883.91MobileSafari/537.36');curl_exec($ch);curl_close($ch);$out=ob_get_contents();ob_clean();$a=preg_match('/weixin:\/\/wap.*/',$out,$str);如果($a){返回substr($str[0],0,strlen($str[0])-1);}else{返回'';}}weixin://wap/pay?prepayid%3Dwx22201221074146ac747121890095299503&package=2656135616&noncestr=1542888966&sign=e31dbc2d1231708ff8a982b15a6c7646是得到的deepLink值,客户端也可以直接通过这个值调整值