vue开发spa应用时 微信支付问题(尤其是ios)

iOS微信支付在VueSPA应用中的坑与解决方案
本文详细描述了在Vue开发的单页应用(SPA)中,遇到的微信支付问题,特别是iOS环境下。问题在于iOS微信支付判断当前路径基于Landing Page,而Android基于Current Page。解决方案包括在支付路径上添加'#!/',以及正确配置微信支付的授权目录。同时提到了微信支付文档中关于URL hash可能导致的问题,并提供了相应配置建议。

Tips:换ios的试试,ios会告诉你什么错误;Android没有


######################终结#######################

window.location.href导致!!!  待跳转路径要加上/#!/

临时解决办法: 两个都加上支付路径:

http://example.com/#!/
http://example.com/#!/order


######################终结#######################







http://get.ftqq.com/8572.get


我们的应用中有3个页面用到微信支付:

http://example.com/#!/cart/index
http://example.com/#!/order/orderlist
http://example.com/#!/order/orderinfo

微信支付允许配置3个目录为授权目录,另外允许配置一个测试环境目录,授权目录必须配置到最后一级目录,配置在根目录不行。到这里其实还都不是问题,问题是微信判断当前路径的方式。

我们先定义两个名词:首先把当前页面叫做“Current Page”;当我们从微信别的地方点击链接呼出微信浏览器时所落在的页面、或者点击微信浏览器的刷新按钮时所刷新的页面,我们叫做“Landing Page”。举个例子,我们从任何地方点击链接进入页面A,然后依次浏览到B、C、D,那么Current Page就是D,而Landing Page是A,如果此时我们在D页面点击一下浏览器的刷新按钮,那么Landing Page就变成了D(以上均是在单页应用的环境下,即以hashbang模式通过js更改浏览器路径,直接href跳转的不算)。

问题来了,在ios和安卓下呼出微信支付的时候,微信支付判断当前路径的规则分别是:

  • IOS:Landing Page
  • 安卓:Current Page

这个规则是我试了N次试出来的,非常的坑,这就意味着,在ios环境下,任何一个页面都有可能成为支付页面(因为我无法预知和控制用户在哪个页面点微信浏览器的刷新按钮,或是用户通过哪个连接从外部进入到系统)。我在网上用了各种方式搜索这个问题的解决方案,都没找到好的,有关这个问题的帖子都少之又少,都只有吐槽它而没有解决了的。

我把这个问题放了好几天,虽然有一个解决方案,就是进入到支付页面的时候使用href跳转的方式,会造成页面刷新,影响一些用户体验。就是因为这个方案不完美,我就一直搁着,今天呢就又把这个问题拿出来鼓捣。

井号“#”后面应该都忽略才对。于是乎,我想了想,反正入口文件就是个静态html,服务器端也不直接接收query,于是就把链接改成了

http://example.com/?#!/cart/index

就加了一个问号,于是微信浏览器妥妥的把井号“#”后面的内容给去掉了


############################################################

官网调用方式不一致问题:


https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E5.8F.91.E8.B5.B7.E4.B8.80.E4.B8.AA.E5.BE.AE.E4.BF.A1.E6.94.AF.E4.BB.98.E8.AF.B7.E6.B1.82


解决办法:

success: function (res) {
  if(res.errMsg == "chooseWXPay:ok" ) {
      //支付成功
  }else{
      alert(res.errMsg);
  }
  },
cancel:function(res){
  //支付取消
}
参考:http://www.liball.me/wxpay-is-shit/


############################################################

必看文章:

1.微信支付遇到的各种坑及解决方案随笔记录, http://www.cnblogs.com/xueranzp/p/5287691.html

支付目录设置,根据 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3 配置授权目录,需要特别注意的是,目录要配置到精确目录,而不是二级或者三级目录,并且区分大小写。目录指的是确认付款的页面目录而不是调用支付的接口目录。 比如商品支付页面链接为 http://www.XXX.com.cn/pay/payorder/a.html 需要配置为 www.XXX.com.cn/pay/payorder/ 

2.微信支付的那些坑 http://www.liball.me/wxpay-is-shit/


3.

https://blog.asaki.me/posts/chooseWXPay-fail/

对着官方文档这句:“发起支付的页面目录必须与设置的精确匹配。”看了半个小时,我突然想到是不是URL hash生成的“/#!/目录”被微信当成了一个次级目录了?越想越觉得就是那么回事儿,然后把支付授权目录改成了这样:

支付授权目录

十分钟后,终于!终于微信支付这个智障认了这个地址!仰天长啸一声卷铺盖下班……

总结一下,写单页应用碰到微信支付的同行们如果用URL hash来实现路由的话,务必要把URL hash后的“目录”也配置进支付授权目录里去,微信是不会理会这个html文件的真正路径的……

<think>嗯,用户想了解在Vue3的H5项目中如何调用微信支付。首先,我得回忆一下微信支付在H5环境下的流程。记得微信支付需要商户账号,并且要配置支付域名,确保安全。然后,用户的前端需要生成支付参数,比如间戳、随机字符串,可能还要后端参与签名。 接下来,用户可能遇到的问题包括配置错误,比如支付域名没设置好,或者参数不正确导致无法调起支付。另外,微信支付需要JSAPI,所以可能需要引入微信的JS文件,或者使用npm包。然后,在Vue3中,应该在生命周期钩子中初始化支付,比如onMounted,或者当用户点击支付按钮触发。 可能还需要和后端配合,后端生成预支付订单,返回必要的参数给前端,前端用这些参数调用wx.chooseWXPay或者新的JSAPI方法。需要注意测试环境,微信支付可能只能在正式域名下生效,所以测试可能需要内网穿透工具如ngrok。 另外,跨平台兼容性也要考虑,不同浏览器或微信内置浏览器的支持情况。还要处理支付成功或失败的回调,更新订单状态,跳转页面等。可能还要提醒用户关于SPA应用的路由问题,避免支付后页面跳转导致的问题。 最后,可能需要给出代码示例,比如如何引入微信JS,如何通过axios获取支付参数,然后调用微信的API。同,提醒用户注意安全,签名要在后端完成,避免暴露密钥。</think>在 Vue3 的 H5 项目中调用微信支付,主要流程分为以下几个关键步骤: ### 一、前期准备 1. **微信商户平台** - 注册并开通微信支付商户账号 - 获取商户号(mch_id)和 API 密钥(API Key) - 配置支付域名(需备案域名) 2. **公众号/服务号** - 认证服务号(H5支付需关联服务号) - 获取公众号 AppID ### 二、核心流程 ```javascript // 示例代码(需配合后端) async function initWechatPay() { // 1. 获取预支付参数 const { appId, nonceStr, package: prepay_id, signType, paySign, timestamp } = await axios.post('/api/create-order', { amount: 100, product: 'VIP会员' }); // 2. 调用微信支付接口 if (typeof WeixinJSBridge === 'undefined') { alert('请在微信内置浏览器中打开'); return; } WeixinJSBridge.invoke('getBrandWCPayRequest', { appId, // 公众号ID timeStamp: timestamp.toString(), // 间戳 nonceStr, // 随机字符串 package: prepay_id, // 预支付ID signType, // 签名方式 paySign // 加密签名 }, (res) => { // 3. 处理支付结果 if (res.err_msg === 'get_brand_wcpay_request:ok') { alert('支付成功'); router.push('/success'); } else { alert('支付失败: ' + res.err_msg); } }); } ``` ### 三、注意事项 1. **签名验证** - 所有参数必须由后端生成签名(前端切勿暴露 API Key) - 签名算法推荐使用 HMAC-SHA256 2. **环境要求** - 必须通过微信内置浏览器打开 - 安卓设备需使用 `WeixinJSBridge` 调用 - iOS 设备也可使用 `window.wx.chooseWXPay` 3. **支付域名** - 需在微信商户平台配置支付授权目录 - 例如:`https://yourdomain.com/pay/` ### 四、常见问题 1. **无法调起支付** - 检查域名是否备案且正确配置 - 验证签名算法是否正确 - 确保间戳单位为秒 2. **跨平台问题** - 非微信浏览器需引导用户用微信打开 - 可通过 URL Scheme 实现应用跳转 3. **支付状态同步** - 建议在支付成功后轮询查询订单状态 - 同配置微信支付结果异步通知 ### 五、调试技巧 1. 使用微信开发者工具调试 2. 通过 `vConsole` 查看日志 3. 利用 `ngrok` 实现本地调试穿透 实际开发中需要与后端紧密配合,确保预支付订单生成、签名验证等环节正确实现。建议参考微信官方文档的最新 H5 支付规范。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值