微信公众号支付,iframe跨域
官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6,即可看到h5调起支付需要的参数。
获取后台调用微信生成的支付签名,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $scope.onBridgeReady = function () { $http.post( "/wechat/createSign" , $scope.payOrder).then(function (data) { var order = data.data.data; WeixinJSBridge.invoke( 'getBrandWCPayRequest' , { "appId" : order.appid, //公众号名称,由商户传入 "timeStamp" : order.timeStamp, //时间戳,自1970年以来的秒数 "nonceStr" : order.nonce_str, //随机串 "package" : "prepay_id=" + order.prepay_id, "signType" : "MD5" , //微信签名方式 "paySign" : order.sign //微信签名 }, function (res) { if (res.err_msg == "get_brand_wcpay_request:ok" ) { //alert("微信支付成功!"); $http.post( "/wechat/toPaySuccessUrl" ).then(function (data) { window.location.href = data.data.data + "?orderNo=" + order.out_trade_no; }) // window.location.href = "http://qiansheng.imwork.net/paydone.html?orderNo=" + order.out_trade_no; } else if (res.err_msg == "get_brand_wcpay_request:cancel" ) { //alert("用户取消支付!"); } else { alert( "支付失败!" ); } }); }) } |
签名算法:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
参考:微信公众号支付(二)H5调起支付 https://blog.csdn.net/zsm15623544116/article/details/79392263
通用demo: https://gitee.com/1600875665/weixinPay
然后需要实现iframe内调起支付
在iframe内发起
1 | top.postMessage(data, '*' ); |
外部做业务处理,可以做支付调起等
1 2 3 | window.addEventListener( "message" , function (e) { wxPay(JSON.parse(e.data)) }) |
微信支付方法封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | function wxPay(wxParams) { // 微信支付API function onBridgeReady() { WeixinJSBridge.invoke( 'getBrandWCPayRequest' , wxParams, function (res) { if (res.err_msg == "get_brand_wcpay_request:ok" ) { // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 console.log(res) alert( "成功" ) } else if (res.err_msg == "get_brand_wcpay_request:cancel" ) { console.log(res) alert( "失败" ) // window.history.go(-1) } }); } if ( typeof WeixinJSBridge == "undefined" ) { if (document.addEventListener) { document.addEventListener( 'WeixinJSBridgeReady' , onBridgeReady, false ); } else if (document.attachEvent) { document.attachEvent( 'WeixinJSBridgeReady' , onBridgeReady); document.attachEvent( 'onWeixinJSBridgeReady' , onBridgeReady); } } else { onBridgeReady(); } } |
注:想在iframe调起window.WeixinJSBridge是不行的,会返回undefined
1 2 3 4 5 6 7 8 9 10 11 12 13 | 1.设置监听 window.addEventListener( 'message' , function (msg) { console.log(msg.data); }) 2.发送 message window.postMessage(”message“, '*' ); 实现多页面通讯; 使用postMessage 需要精确的目标origin,不要用 *。 |
iframe: https://www.w3school.com.cn/tags/tag_iframe.asp
跨域iframe实例: https://www.jb51.net/article/123740.htm https://www.cnblogs.com/qidian10/p/3316714.html
调用parent页面的方法: https://blog.csdn.net/shuaidao_wupengyou/article/details/73497528?locationNum=10&fps=1
window.addeventlistener使用方法:https://www.cnblogs.com/ConfidentLiu/p/7815624.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!