使用Ping++完成H5页面支付功能
来源:互联网 发布:淘宝买家最多买多少 编辑:程序博客网 时间:2024/05/16 03:32
最近公司项目有个充值需求,在微信公众号中添加在线充值,充值页面是用H5完成的,页面中包括微信支付方式和支付宝支付方式。也就是说,要在微信内置浏览器中完成微信支付和支付宝支付。
这个页面,我通过接入Ping++的H5 SDK完成充值功能。附上Ping++的H5 SDK接入指南地址:Ping++ H5 SDK接入指南
开发之前,建议先看一下SDK,有一个大致的了解,然后可以下载demo。附上Github上的demo下载地址:Github上的demo地址。这个链接在文档中也有。
在下载的文件中,有一个demo文件夹,其中的wap.html可以作为开发参考。
下面是ping++支付中前端开发流程的总结(当然需要后端的配合),需要可以做个参考。
微信支付
1.引入pingpp.js文件(文件路径都是我自己项目的文件路径,应该根据自己的项目进行修改)。
<script src="node_modules/pingpp-js/dist/pingpp.js"></script>
2.js中写入支付函数,参照demo中wap.html的wap_pay( )函数。
刚开始我是将demo中的函数直接复制过来的,但是测试过程中post请求这一块总是有问题,数据发送不过去,我就稍微修改了一下,但是没搞明白为什么demo中的会出错,有清楚的朋友欢迎评论中赐教。示例:
function wap_pay(channel) { var YOUR_URL = 后台的充值接口; if(YOUR_URL.length == 0 || !YOUR_URL.startsWith('http')){ alert("请填写正确的URL"); return; } var amount = document.getElementById('amount').value * 100; //获取充值金额 var xhr = new XMLHttpRequest(); xhr.open("POST", YOUR_URL, true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded;application/json;charset=UTF-8"); xhr.send("channel="+channel+"&amt="+amount+"&id="+id+"&open_id="+open_id); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { try{ var charge = JSON.parse(xhr.responseText)['charge']; }catch(err){ alert('系统错误!'); } pingpp.createPayment(xhr.responseText, function(result, err) { console.log(result); console.log(err.msg); console.log(err.extra); if (result == "success") { // 只有微信公众账号 wx_pub 支付成功的结果会在这里返回,其他的支付结果都会跳转到 extra 中对应的 URL(后端处理)。 //我的项目中在微信公众号支付成功会跳转到我们的支付成功页面 window.location.href = 'success.html'; } else if (result == "fail") { // charge 不正确或者微信公众账号支付失败时会在此处返回 //支付失败会跳转到支付失败页面 window.location.href = 'fail.html'; } else if (result == "cancel") { // 微信公众账号支付取消支付 //取消支付同样跳转到支付失败页面 window.location.href = 'fail.html'; } }); } }}
注:请求中需要传给后端的数据,由自己的项目需求而定,比如我的项目中就需要传入用户的id。
关于open_id的获取
微信公众号支付中,需要注意的是,要获取用户的open_id作为用户唯一标识,才能唤起微信支付。同时还需要配置安全域名之类的,我是公司的技术负责人配置的。文档中有链接地址。
关于open_id的获取方式,我是通过和后端协商以后决定的,大致的前后端交互思路如下:
1. 进入充值页面以后,当用户选好金额,点击微信支付按钮时,跳转至后端给的一个链接,也就是一个后台接口地址,同时将金额和用户id拼接在地址后。
2. 后端在接口中,会默认用户授权登录,获取到授权code,再使用code获取open_id。
3. 后端获取到open_id以后,会将页面跳转到开始的H5充值页面,同时将金额、用户id以及open_id拼接在url地址中。
4. 前端,嗯,也就是我,获取到url中的数据,然后直接执行wap_pay(‘wx_pub’)支付函数,同时将channel、金额、用户id、open_id通过post请求传给后端。
5. 后端返回正确的charge,就可以成功调起支付。(charge中应该是要包含open_id)
6. 在这个过程中,用户的视觉效果就是,点击微信支付以后,页面刷新了一下, 随后就直接调起了微信支付。
上述是一个前后端交互的思路,结合到前端代码的编写,我是按照如下思路编写的:
1. 用户进入充值页面以后,先判断url地址中是否拼接了open_id字段,如果没有拼接,则跳转至后端接口地址。获取url地址中拼接参数的方法,可以参考我的另一篇博客,其中有附加代码。JS跨页面调用变量的方法。
2. 如果获取到了url地址中open_id字段,则直接执行wap_pay(‘wx_pub’)。
注:获取到open_id重新返回充值页面以后,之前页面中的金额被选中状态已经没有了,所以这里需要根据url中返回的金额,通过JS逻辑将页面重现跳转之前的状态。
这里附上我关于这部分的代码作为参考,不同的项目要根据自己的页面以及需求去修改JS逻辑。
//获取url中的open_idvar Request = new Object();Request = GetRequest();open_id = Request['open_id'];if(open_id == undefined){ $('.wx').unbind('click').click(function(){ if(jingyu_id == '' || jingyu_id == null){ alert('请登录后再充值!'); }else{ if($('#amount').length > 0){ window.location.href = 'http://a.whale.ikanlive.com/web/wx_pub_pay?money='+amount+'&id='+jingyu_id; }else{ alert('请选择充值金额!'); } } })}else{ //这部分代码是为了复现页面跳转之前的状态,也就是页面跳转回来以后,页面仍然是选中金额的状态 amount = parseInt(Request['money']); var money = amount + '元'; $('.content').find('.content_li').each(function(){ if($(this).find('.zs_price').text() == money){ $(this).css('background-image','url(img/images_xz_@2x.png)'); $(this).attr('id','amount'); } }); //执行支付函数 wap_pay('wx_pub');}
支付宝支付
支付宝支付相比微信支付,要简单一些。只需要在点击按钮时,直接执行wap_pay(‘alipay_wap’);
但是存在的一个问题是,在微信内置浏览器中,是无法直接调起支付宝网页版支付控件的。
针对这一问题,Ping++给出的解决方案是这样的:
这上面的两种解决方案都是让充值页面跳转至一个中间页,中间页会提示用户用手机浏览器打开当前页面。
第一种是将pay.htm文件放在和H5充值页面同级目录下。
第二种方式,在充值页面html文件中添加代码:
然后修改pay.htm最下面的代码:
上面两种方式我都尝试过了,但是都不起作用,点击支付宝支付还是出现了一长串链接。这个问题搞了很久都没有解决,中间页就是无法唤起。后来无奈换了需求,自己做了一个中间跳转页面,然后点击支付宝支付时,跳转至自己的中间页面,提示用户在手机浏览器中打开。这一块有清楚的也欢迎评论留言哦~
支付宝支付思路
所以点击支付宝支付时,先判断当前浏览器,如果是微信浏览器,则跳转中间页,如果是手机浏览器,则执行支付函数。代码示例如下:
//点击支付宝支付判断浏览器$('.zfb').unbind('click').click(function(){ var ua = navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i)=="micromessenger") { // 微信 JS逻辑根据自己需要进行修改 $('.prompt').slideDown('slow'); } else { if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { //苹果手机浏览器 wap_pay('alipay_wap'); } else if (/(Android)/i.test(navigator.userAgent)) { //安卓手机浏览器 wap_pay('alipay_wap'); } else { confirm('请通过手机浏览器查看此页面!'); } } })
一个大概的微信内置浏览器中微信支付和支付宝支付的总结,前端方面的任务其实很简单,只需要将页面搭建好,然后在点击支付按钮时,执行demo中的wap_pay()函数,向后台发送正确的ajax请求就可以了,主要是后端要返回正确的charge。
文章中有描述不清楚的地方或者错误的地方还希望能及时指出。后续再有关于H5支付或者PC支付的项目,也会进行补充。
- 使用Ping++完成H5页面支付功能
- 使用Ping++完成H5页面支付功能
- 通过ping++平台完成移动端H5支付
- h5页面 支付宝支付
- 关于H5页面支付
- iOS ping++支付功能实现
- h5页面调用支付宝支付
- 如何完成支付宝的支付功能?
- 如何完成支付宝的支付功能?
- 如何完成支付宝的支付功能?
- Node.js+MongoDB+Express网站开发(一):使用Ping++SDK接入支付功能
- 使用js代码完成页面文本防复制功能
- 调用支付宝接口,完成付款功能
- Android使用微信H5支付
- ping++支付
- ping++支付
- Unittest实现H5页面接口功能测试
- H5 单页面解决“前进”,“后退”功能
- more effective c++之Item M3:不要对数组使用多态
- 模仿动态增加或者删除cell并自动增加变化高度
- JavaSE_JDBC编程
- webApp滚动选择器-实践与应用
- 关于Unity代码控制音频播放的问题
- 使用Ping++完成H5页面支付功能
- xcode远程编译打包签名问题
- 锋利的Jquery——学习笔记(五)DOM操作(二)
- 使用SerialDevice.FromIdAsync(dis[0].Id)生成SerialDevice时dis[0].Id存在,但SerialDevice为空的解决办法
- jedisLock—redis分布式锁实现
- JAVA开发微信图灵机器人【L】
- 用js做一个简单的电商放大镜效果
- java客户端对cookie的操作
- sudo