开发前配置
进行代码接入前,需在微信后台填写授权回调域名,此域名必须经过ICP备案

开发主要流程

  • 用户下单时选择微信支付
  • 商户进行业务逻辑处理并调用微信统一下单接口,微信H5交易类型为:trade_type=MWEB
  • 调用下单接口成功时,微信会返回包含支付跳转URL等相关参数,商户通过参数mweb_url调起支付中间页
  • 在中间页微信会进行H5权限的校验
  • 支付成功,微信会向商户发送异步结果通知

正式开发
调起微信支付,只说明必要参数
请求微信统一下单接口,接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder

接口请求参数

  • appid:微信公众号iD
  • mch_id:账户号
  • nonce_str:随机字符串,不长于32位
  • sign:签名
  • body:商品描述
  • out_trade_no:商户订单号,不长于32位
  • total_fee:总金额,以分为单位
  • spbill_create_ip:用户端请求支付时的IP
  • notify_url:异步通知回调地址,必须是可直接访问地址,不能携带参数
  • trade_type:交易类型,如H5则是MWEB

以上便是H5支付下单所需要的参数

签名生成

  • 参与生成签名的参数必须非空
  • 参数按照ASCII码由小到大排序,参数名区分大小写
  • 按照上述规则,将参数拼接成如k1=v1&k2=v2…的字符串
  • 将上一步得到的字符串拼接上key, 如k1=v1&k2=v2&key=192006250b4c09247ec02e
  • 再将最后得到的字符串进行MD5加密,再转为大写,即为最终的sign值

代码:

    /*** 组建签名* @param array $params 请求参数* @param string $key 秘钥*/public function genSign($params, $key){foreach ($params as $k=>$v) {if (!$v) {unset($params[$k]);}}ksort($params);$paramStr = '';foreach ($params as $k => $v) {$paramStr = $paramStr . $k . '=' . $v . '&';}$paramStr = $paramStr . 'key='.$key;$sign = strtoupper(md5($paramStr));return $sign;}

发起请求

将参数转为XML数据,即可发起请求
将数组转为XML代码:

    /*** 将数组转为XML* @param array $params 支付请求参数*/public function array_to_xml($params){if(!is_array($params)|| count($params) <= 0) {return false;}$xml = "<xml>";foreach ($params as $key=>$val) {if (is_numeric($val)) {$xml.="<".$key.">".$val."</".$key.">";} else {$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";}}$xml.="</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数据:

<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxdded766660f9b840]]></appid>
<mch_id><![CDATA[1516216351]]></mch_id>
<device_info><![CDATA[100]]></device_info>
<nonce_str><![CDATA[2DUN2i2pGnlC6vDi]]></nonce_str>
<sign><![CDATA[95CEA831D598299097A32D8FEEC6BDEF]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx22194530678545eb3713f2f10724143329]]></prepay_id>
<trade_type><![CDATA[MWEB]]></trade_type>
<mweb_url><![CDATA[https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx22194530678545eb3713f2f10724143329&package=87106983]]></mweb_url>

return_codeSUCCESS代表支付请求成功;
mweb_url则为支付跳转页,此时客户端通过mweb_url已经可以调起微信支付

中间页处理

在得到微信返回的mweb_url参数后,可在服务端进一步获得deepLink
代码:

    /*** 获取微信支付中间页deepLink参数* @param string $url 微信返回的mweb_url* @param string $ip 用户端IP*/public function getDeeplink(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; 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();$a = preg_match('/weixin:\/\/wap.*/',$out, $str);if ($a) {return substr($str[0], 0, strlen($str[0])-1);} else {return '';}}

weixin://wap/pay?prepayid%3Dwx22201221074146ac747121890095299503&package=2656135616&noncestr=1542888966&sign=e31dbc2d1231708ff8a982b15a6c7646即为得到的deepLink值,客户端也可以通过此值直接调起支付

H5微信回调

/*** h5 微信回调 函数*/
public 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') {//这块支付完成之后更新订单状态以及其它操作。}
}

获取ip

/*** @return 获取ip*/private function getClientIp(){$cip='unknown';if ($_SERVER['REMOTE_ADDR']){$cip=$_SERVER['REMOTE_ADDR'];}elseif (getenv($_SERVER['REMOTE_ADDR'])){$cip=getenv($_SERVER['REMOTE_ADDR']);}return $cip;}

PHP实现微信公众号H5支付相关推荐

  1. php h5微信公众号支付接口,微信公众号H5支付接口调用方法

    本文实例为大家分享了 微信内h5调用支付接口的具体代码,供大家参考,具体内容如下 官方文档 微信公众号h5接口调用 // 判断微信版本是否在5.0以上 // window.navigator.user ...

  2. 微信公众号H5支付遇到的那些坑

    简史 官方文档说的很清楚,商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 当然,最近微信支付平台也加入了纯H5支付,也就是说用户可以在微信以外的 ...

  3. uni-app微信公众号H5支付页面

    准备工作 初始化公众平台测试账号系统. 地址: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 登录后,会得到一个测试公众 ...

  4. 微信公众号h5支付完后无返回值,整个h5页面被关闭

    最近做个挂在公众号下的h5项目,刚开始的微信支付,整个流程没什么问题,支付完后回调也没问题,但后面客户要求支付走第三方的东西,收到的钱什么的由第三方接管,就遇到问题了,支付完后,点完成,整个h5都被关 ...

  5. uniapp 开发微信公众号H5 隐藏右上角扩展按钮

    uniapp 开发微信公众号H5 隐藏右上角扩展按钮 1.首先使用npm安装一下微信的jsApi (这个应该都会吧 就跟vue使用npm安装依赖一样) 初始化: npm init -y 安装微信模块: ...

  6. java微信公众号JSAPI支付以及所遇到的坑

    java微信公众号JSAPI支付以及所遇到的坑 上周做了个支付宝微信扫码支付,今天总结一下.微信相比支付宝要麻烦许多 由于涉及到代理商,没办法,让我写个详细的申请流程,懵逼啊. 笔记地址 http:/ ...

  7. 微信小程序webview清除缓存、微信公众号h5清除缓存、页面白屏、空白、不刷新问题

    一.缓存带来的问题和原因 我们在发布新版本的时候,在打开微信小程序webview嵌套的h5页面或微信公众号h5页面时,常常会发现页面还是上个版本的旧页面或者打开直接空白 白屏了,那么为什么会存在这个问 ...

  8. 【微信公众号H5授权登录】

    微信公众号H5授权登录 废话不多,直接上代码(这里只写代码的实现) 废话不多,直接上代码(这里只写代码的实现) 页面进来判断微信环境 onShow() {//设置初始值为false,微信环境下才能打开 ...

  9. 微信公众号H5页面开发--微信JS-SDK引用

    微信公众号H5页面开发–微信JS-SDK引用 微信提供了微信公众号开发者手册,官方地址:https://mp.weixin.qq.com/ 公众号内许多复杂的业务场景,都是通过网页形式来提供服务,这时 ...

最新文章

  1. Python3 类和继承和组合
  2. UA MATH563 概率论的数学基础 鞅论初步4 Radon-Nikodym定理,条件期望的存在唯一性
  3. mysql5.5.3下载_MySQL5.5.5M3发布-下载_MySQL
  4. 计算机视觉招聘_香港理工大学人工智能设计实验室科研招聘
  5. vsftpd配置文件丢失
  6. 面试时如何介绍自己的项目经验
  7. java - 抽象类、接口、内部类
  8. linux 环境下安装 docker 精简步骤
  9. python+Django+test 测试数据库生成报错
  10. ColorBlinder(我是色盲)
  11. 计算机指法游戏警察抓小偷,警察抓小偷打字游戏游戏
  12. 两个月快速通过软考高项(信息系统项目管理师)备考技巧
  13. Python周刊518期
  14. iOS开发系列--NextPrevious On-Demand Resource Basics
  15. python爬12306余票_Python 爬取12306火车票
  16. Percent Library百分比布局详解
  17. TypeScript入门案例
  18. 解决问题:xshell6评估已过期
  19. 迷宫最短路径问题(数据结构4.4.3 拓展)
  20. UG NX 12 坐标系

热门文章

  1. 身份证号码的规则及验证原理
  2. URP——着色器和材质——简单光照 Simple Lit
  3. HTML5视频手机全屏,HTML5在手机端实现视频全屏展示方法
  4. C++语言篇 字符串及字符数组练习
  5. OpenPortal V5认证计费系统说明文档
  6. Java开发技巧!和阿里大佬的技术面谈
  7. 【操作系统】操作系统知识点整理;C++ 实现线程池与windows 线程池的使用;
  8. 7.熟练掌握ES Java API基于upsert实现汽车最新价格的调整
  9. #433 津津有味:红黑榜 | 要不是为了热量缺口,谁爱吃它!
  10. 二、Apollo高精地图详解(2. 高精地图的采集、生产与格式规范)