返回旧版| 微信建站| 我要建站 | 建站学习 | 加入收藏
PHP基础当前位置:首页 > HTML教程 > PHP基础 > 正文

【转载】一个PHP文件搞定微信H5支付

发布时间:2019-08-30 22:48:53   来源:   点击:
开发流程
1、用户在商户侧完成下单,使用微信支付进行支付

2、由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型 trade_type=MWEB

3、统一下单接口返回支付相关参数给商户后台,如支付跳转 url(参数名“mweb_url”),商户通过 mweb_url 调起微信支付中间页

4、中间页进行 H5 权限的校验,安全性检查(此处常见错误请见下文)

5、如支付成功,商户后台会接收到微信侧的异步通知

6、用户在微信支付收银台完成支付或取消支付,返回商户页面(默认为返回支付发起页面)

7、商户在展示页面,引导用户主动发起支付结果的查询

8、商户后台判断是否接到收微信侧的支付结果通知,如没有,后台调用订单查询接口确认订单状态

9、展示最终的订单支付结果给用户

网上的对于微信 H5 支付的资源感觉少之又少,可能是因为微信 H5 支付出来时间不久吧,很多 PHP 微信支付接入教程都比较复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入微信 H5 支付的带来些许帮助和借鉴意义。以下为本篇文章的重点:

PHP 代码
  1. <?php 
  2. /** 
  3.  * 微信 H5 支付 PHP 版本 demo 部分代码来自网络 
  4.  * 作者:沈唁  
  5.  * 博客:https://qq52o.me 
  6.  */ 
  7. $money= 1;                     //充值金额 微信支付单位为分 
  8. $userip = get_client_ip();     //获得用户设备 IP 
  9. $appid  = "";                  //应用 APPID 
  10. $mch_id = "";                  //微信支付商户号 
  11. $key    = "";                 //微信商户 API 密钥 
  12. $out_trade_no = date('YmdHis').rand(1000,9999);//平台内部订单号 
  13. $nonce_str = createNoncestr();//随机字符串 
  14. $body = "H5 充值";//内容 
  15. $total_fee = $money; //金额 
  16. $spbill_create_ip = $userip; //IP 
  17. $notify_url = "http://qq52o.me/wxpay/notify.php"; //回调地址 
  18. $trade_type = 'MWEB';//交易类型 具体看 API 里面有详细介绍 
  19. $scene_info ='{"h5_info":{"type":"Wap","wap_url":"http://qq52o.me","wap_name":"支付"}}';//场景信息 必要参数 
  20. $signA ="appid=$appid&attach=$out_trade_no&body=$body&mch_id=$mch_id&nonce_str=$nonce_str&notify_url=$notify_url&out_trade_no=$out_trade_no&scene_info=$scene_info&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type"
  21. $strSignTmp = $signA."&key=$key"//拼接字符串  注意顺序微信有个测试网址 顺序按照他的来 直接点下面的校正测试 包括下面 XML  是否正确 
  22. $sign = strtoupper(MD5($strSignTmp)); // MD5 后转换成大写 
  23. $post_data = "<xml> 
  24.                     <appid>$appid</appid> 
  25.                     <mch_id>$mch_id</mch_id> 
  26.                     <body>$body</body> 
  27.                     <out_trade_no>$out_trade_no</out_trade_no> 
  28.                     <total_fee>$total_fee</total_fee> 
  29.                     <spbill_create_ip>$spbill_create_ip</spbill_create_ip> 
  30.                     <notify_url>$notify_url</notify_url> 
  31.                     <trade_type>$trade_type</trade_type> 
  32.                     <scene_info>$scene_info</scene_info> 
  33.                     <attach>$out_trade_no</attach> 
  34.                     <nonce_str>$nonce_str</nonce_str> 
  35.                     <sign>$sign</sign> 
  36.             </xml>";//拼接成 XML 格式 
  37. $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";//微信传参地址 
  38. $dataxml = postXmlCurl($post_data,$url); //后台 POST 微信传参地址  同时取得微信返回的参数  
  39. $objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); //将微信返回的 XML 转换成数组 
  40. function createNoncestr( $length = 32 ){ 
  41.     $chars = "abcdefghijklmnopqrstuvwxyz0123456789"
  42.     $str =""
  43.     for ( $i = 0; $i < $length; $i++ )  { 
  44.         $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); 
  45.     } 
  46.     return $str; 
  47. function postXmlCurl($xml,$url,$second = 30){ 
  48.     $ch = curl_init(); 
  49.     //设置超时 
  50.     curl_setopt($ch, CURLOPT_TIMEOUT, $second); 
  51.     curl_setopt($ch,CURLOPT_URL, $url); 
  52.     curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); 
  53.     curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); 
  54.     //设置 header 
  55.     curl_setopt($ch, CURLOPT_HEADER, FALSE); 
  56.     //要求结果为字符串且输出到屏幕上 
  57.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
  58.     //post 提交方式 
  59.     curl_setopt($ch, CURLOPT_POST, TRUE); 
  60.     curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 
  61.     //运行 curl 
  62.     $data = curl_exec($ch); 
  63.     //返回结果 
  64.     if($data){ 
  65.         curl_close($ch); 
  66.         return $data; 
  67.     }else
  68.         $error = curl_errno($ch); 
  69.         curl_close($ch); 
  70.         echo "curl 出错,错误码:$error"."<br>"
  71.     } 
  72. function get_client_ip($type = 0) { 
  73.     $type       =  $type ? 1 : 0; 
  74.     $ip         =   'unknown'
  75.     if ($ip !== 'unknown'return $ip[$type]; 
  76.     if($_SERVER['HTTP_X_REAL_IP']){//nginx 代理模式下,获取客户端真实 IP 
  77.         $ip=$_SERVER['HTTP_X_REAL_IP']; 
  78.     }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {//客户端的 ip 
  79.         $ip     =   $_SERVER['HTTP_CLIENT_IP']; 
  80.     }elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {//浏览当前页面的用户计算机的网关 
  81.         $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); 
  82.         $pos    =   array_search('unknown',$arr); 
  83.         if(false !== $pos) unset($arr[$pos]); 
  84.         $ip     =   trim($arr[0]); 
  85.     }elseif (isset($_SERVER['REMOTE_ADDR'])) { 
  86.         $ip     =   $_SERVER['REMOTE_ADDR'];//浏览当前页面的用户计算机的 ip 地址 
  87.     }else
  88.         $ip=$_SERVER['REMOTE_ADDR']; 
  89.     } 
  90.     // IP 地址合法验证 
  91.     $long = sprintf("%u",ip2long($ip)); 
  92.     $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0); 
  93.     return $ip[$type]; 
  94. ?> 
HTML 代码
  1. <a class="pay" href="<?php echo $objectxml['mweb_url'] ?>"><button class="pay">确认支付</button></a>  
以上为微信 H5 支付 demo 的全部代码,其中 HTML 部分中的 mweb_url 是为拉起微信支付收银台的中间页面,可通过访问该 url 来拉起微信客户端,完成支付,mweb_url 的有效期为 5 分钟。

回调部分
因为微信支付相关回调代码基本一样具体可参考官网demo

如何使用
标题说的就是单 PHP 文件完成微信支付,你可以把 HTML 代码写在 PHP 文件的后面,或者在 HTML 文件里面引入 PHP 文件,就可以使用了。

支付成功跳转
正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在 MWEB_URL 后拼接上 redirect_url 参数,来指定回调页面。需对 redirect_url 进行 urlencode 处理

版权所有:郑州腾石网络科技有限公司 备案信息:豫ICP备18019117号
站长QQ:2863868475 业务合作咨询:15137100750(同微信)
本站所有投放的广告是有其他网站提供,不代表本站立场,同时网站首页广告位对外出租详情咨询本站站长!同时欢迎广大站长加入个人建站团队
  • 建站客服
  • CMS仿站
  • CMS学习
  • 技术交流群:336572814