微信支付 第三篇 微信调用H5页面进行支付
上一篇讲到拿到了 预支付交易标识 wx251xxxxxxxxxxxxxxxxxxxxxxxxxxxxx078700
第四步,是时候微信内H5调起支付了!
先准备网页端接口请求参数列表
微信文档中已经明确给出了所有参数名和参与签名计算的参数,即
- appId,具有支付权限的与微信支付商户关联绑定的公众号的APPID
- timeStamp,10位当前Unix时间
- nonceStr,<=32 位的随机信息,请求方自行随意生成即可
- package,统一下单接口返回的prepay_id参数值,提交格式为:prepay_id=xxx
- signType,签名方式,MD5或HMAC-SHA256,默认MD5,需要与统一下单的签名类型一致
- paySign,计算后的签名值
计算签名
微信文档中给出参与签名的参数是 appId、timeStamp、nonceStr、package、signType,要注意计算签名的方法和《微信支付 第二篇 JSAPI 调用统一下单接口获取预支付交易数据》计算方式是一致的,回顾一下
- 先把参数正序排序
- 参数值为空的去除不参与下面计算
- 把所有符合条件的参数键值对按照URL查询参数格式组成字符串即 key1=value1&key2=value2...得到结果字符串 StringA
- 把 StringA 后面再加上一个参数值对即 ...&key=MCHKEY 得到结果字符串 StringB (MCHKEY为商户密钥)
- 将 StringB 按签名方式 signType 进行计算
- 将计算结果转为大写字符串,该值赋值给 paySign
需要注意的是,参数名要严格按照腾讯文档的命名方式,包括大小写,如 appId 不能写成 appid 或 appID。开发时为了方便,H5页面将部分参数设置成了可编辑文本框,先看一下它的样子

本例中,点击创建随机字符串将获得当前时间戳,将其作为 nonceStr 和 timeStamp 的值,点击创建签名计算出完整结果,本例中由于 JS 实现 hmacsha256 比较麻烦,就改用了 MD5 方式,根据微信要求统一下单接口中的签名算法也改为了 MD5,下面列出本例实现代码
<!--创建完整签名-->
<script type="text/javascript">
function onCreatePaySign() {
// 从网页的各个文本框获取参数值
var appid = $("#text-appid").val();
var nonceStr = $("#text-nonceStr").val();
var prepayid = $("#text-prepayid").val();
var timeStamp = nonceStr;
var signType = "MD5";
// 拼接字符串
var sourceStr = "";
sourceStr += "appId=" + appid;
sourceStr += "&nonceStr=" + nonceStr;
sourceStr += "&package=prepay_id=" + prepayid;
sourceStr += "&signType=" + signType;
sourceStr += "&timeStamp=" + timeStamp;
sourceStr += "&key=asxxxxxxxxxxxxxxxN82";
// MD5方式计算
var hash = md5(sourceStr).toUpperCase();
// 在页面中查看一下计算结果
$("#text-paySign").val(hash);
// 在控制台查看拼接字符串原文和MD5结果
console.log("拼接字符串结果: " + sourceStr);
console.log("MD5结果: " + hash);
}
</script>
对比查看结果(为了不泄露,appId和mchKey均作了处理,但因为算法固定,因此签名计算结果完全不影响正确性)

真实设备下调用微信支付接口进行实际支付
这一步的"坑"是,必须要在真实设备下进行访问,也就是手机、平板等运行微信APP的设备,微信开发者工具都不行,会报错无法运行。因此,H5 页面或者说运行微信支付的那部分 JS 一定要在真实设备上才能正确运行。先看一下微信给出的源代码(官方文档里有)
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp":"1395712654", //时间戳,自1970年以来的秒数
"nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串
"package":"prepay_id=u802345jgfjsdfgsdg888",
"signType":"MD5", //微信签名方式:
"paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}
});
}
就是这段代码,必须要在真实设备运行,因此本例中采取的方式是将 H5 页面放到服务器上,用开发者工具运行 获取openid 和 获取预支付交易标识 两个步骤,拿到交易标识后在手机端微信里打开 H5 页面,生成签名并运行支付。根据实际情况,对放到 H5 页面中的 onBridgeReady 函数进行了修改,使其从文本框中获取真实数据
<!--微信支付调用-->
<script type="text/javascript">
function onBridgeReady() {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId": $("#text-appid").val(), //公众号名称,由商户传入
"timeStamp": $("#text-nonceStr").val(), //时间戳,自1970年以来的秒数
"nonceStr": $("#text-nonceStr").val(), //随机串
"package": "prepay_id=" + $("#text-prepayid").val(),
"signType": "MD5", //微信签名方式:
"paySign": $("#text-paySign").val() //微信签名
},
function (res) {
console.log("微信支付返回值:");
console.log(res);
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
alert("get_brand_wcpay_request:ok");
}
alert(res.err_msg);
alert(res); // 显示是个 Object
});
}
</script>
在手机中,点击页面上的支付按钮,将调起真实的微信支付页面,支付时忘了截图,首先先显示的是信息页和金额,点击支付输入密码/录入指纹,验证成功即支付成功,显示支付成功页面(这个有),并且在用户微信内也会接到来自微信支付的通知消息。本例实现时并没有做H5支付成功后的处理页面,因此在支付成功页面中点击完成,就回到了H5页面中,运行了 function (res) 内的代码,并在弹窗中显示出了相关信息


总结
至此,完成了微信支付 JSAPI 支付主要流程。罗列一下关键点
- 服务器环境使用了自有真实网站 wxpay.txxxt.com,完整路径 http://wxpay.txxxt.com/jsapi/,这也是在商户管理后台的 支付授权目录 中配置的路径,即发起微信支付调用的页面是来自该目录
- 所有页面和接口都放在了该目录下,getCode.php + codeCallback.php 配合获取 openid,unifiedorder.php?openid=xxxx 负责根据openid获取预支付交易标识,拿到交易标识后 h5pay.html 负责调起支付
- 前两项可以在web开发者工具内运行,选择公众号网页调试即可,调起支付必须在真实设备运行
微信支付 第三篇 微信调用H5页面进行支付的更多相关文章
- iOS “请在微信客户端打开链接” UIWebview加载H5页面携带session、cookie、User-Agent信息 设置cookie、清除cookie、设置User-Agent
公司新开的一个项目..内容基本上是加载H5页面显示..当时觉得挺简单的..后来发现自己掉坑里了..一些心理历程就不说了..说这个项目主要用到的知识点吧..也是自己踩得坑. 首先说说..这个项目上的内容 ...
- asp.net微信开发第三篇----自定义会话管理
和微信用户的沟通少不了,总觉得看起来微信官网后台管理中的会话回复消息有点呆板,所以我这里就自定义了一个会话管理功能,最终效果图如下: 因为我试使用富文本文件CKEDITOR来进行编写,你看到稳中可能会 ...
- 关于JS交互--调用h5页面,点击页面的按钮,分享到微信朋友圈,好友
关于js交互,在iOS中自然就想到了调用代理方法 另外就是下面的,直接上代码了: 如果你的后台需要知道你的分享结果,那么,就在回调里面调用上传到服务器结果的请求即可
- angularjs中安卓原生APP调用H5页面js函数,js写法应注意
安卓原生app调用js方法,js方法应写在html下的script标签内,不能有任何function包裹,例如angular的controller层,这样APP也是获取不到的: 所以只有放在html中 ...
- 微信小程序web-view(webview) 嵌套H5页面 唤起微信支付的实现方案
场景:小程序页面有一个web-view组件,组件嵌套的H5页面,要唤起微信支付. 先讲一下我的项目,首先我是自己开发的一个H5触屏版的商城系统,里面含有购物车,订单支付等功能.然后刚开始,我们公众号里 ...
- 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索
本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...
- 微信公众号开发《三》微信JS-SDK之地理位置的获取与在线导航,集成百度地图实现在线地图搜索
本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...
- 客户端相关知识学习(一)之混合开发,为什么要在App中使用H5页面以及应用场景、注意事项
混合开发 随着移动互联网的高速发展,常规的开发速度已经渐渐不能满足市场需求.原生H5混合开发应运而生,目前,市场上许多主流应用都有用到混合开发,例如支付宝.美团等.下面,结合我本人的开发经验,简单谈一 ...
- Hybrid APP之Native和H5页面交互原理
Hybrid APP之Native和H5页面交互原理 Hybrid APP的关键是原生页面与H5页面直接的交互,如下图,痛过JSBridge,H5页面可以调用Native的api,Native也可调用 ...
随机推荐
- UML类图绘制
UML图简介 含义:UML-Unified Modeling Language 统一建模语言,又称标准建模语言.是用来对软件密集系统进行可视化建模的一种语言 主要模型: 功能模型:从用户的角度展示系统 ...
- 带着canvas去流浪系列之七 绘制水球图
[摘要] 用原生canvasAPI实现百度echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...
- YUM平台的搭建
网络安全学习内容 三.挂载yum仓库 3.1连接映像文件 步骤如下: 1.右击映像文件,单击设置,选择CentOS映像文件 2.右击映像文件,单击连接 3.2挂载本地yum 打开终端,输入vim /e ...
- 利用Mitmproxy抓包
http://mrpeak.cn/blog/mitmproxy/ 和Charles同样强大的免费抓包软件. 它是在终端操作的,界面没有Charles那么可视化.不过也很好用,通过各种快捷键操作,效 ...
- iOS apns推送
前言:推送分为本地推送以及远程推送. 两者的区别为本地推送一般为定时推送.定期推送或者位置推送.而远程推送更为多样化,能满足较高的要求.当然远程推送需要服务器端开发,开发流程较复杂. 1.本地推送只需 ...
- ThreadLocal的进化——InheritableThreadLocal
之前有介绍过 ThreadLocal,JDK 后来针对此做了一个升级版本 InheritableThreadLocal,今天就来好好介绍下. 为什么要升级 首先我们来想想,为什么要升级?这就要说起 T ...
- GeoTools介绍、环境安装、读取shp文件并显示
GeoTools是一个开放源代码(LGPL)Java代码库,它提供了符合标准的方法来处理地理空间数据,例如实现地理信息系统(GIS).GeoTools库实现了开放地理空间联盟(OGC)规范. Geot ...
- 地兵布阵 -----------HDU-1166
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...
- 如何打造个人km知识管理系统
经常有朋友会遇到这样一种情况,在网络中看到一篇很好的文章,但后来因为关键字想不起来,结果怎么都搜索不到.还有些朋友虽然平时也会做一些记录,把有用的资料进行保存,但他们往往将保存的资料分散在不同的地方, ...
- zabbix系列-Grafana4.6.3+Zabbix 的安装部署
zabbix系列(五) Grafana4.6.3+Zabbix 的安装部署 伟创享 2019-07-31 11:27:18 使用了一段时间Grafana,感觉还挺好用的.部分效果图如下: zabb ...