s***@aliyun.com
s***@aliyun.com
  • 发布:2017-09-06 21:01
  • 更新:2018-06-01 11:44
  • 阅读:8487

微信H5支付安卓端失败

分类:MUI
   1. 写在前面:我现在在做微信支付,由于某种原因没有使用plus.payment.request,而用的是微信官方提供的H5支付。  
   2. 现在遇到的问题是,同样的代码,ios就可以调起微信支付页面,但是安卓就不行。  
   3. 附件中的“调起支付页面.png”是我调起微信支付的代码,红色椭圆中的就是微信返回给我的支付跳转URL,就是"微信官方H5支付流程.png"中画圈的第3步。  
   4. 然后就在第4步的时候出了问题,ios检查就OK,andorid就不行,提示“商家参数格式错误”,如图“错误.png”。  
   5. 对于这个错误,微信官方给出的原因是需要在请求头里手动设置Referer,如图“错误原因.png”。可以看到我在"调起支付页面.png"中是配了Referer的,而且ios也确实调起支付页面并且支付成功了。  
   6. 那么根据我的分析,就是安卓端的webView并没有成功配置Referer。  
   Q:我现在要提的问题就是,我要怎么写才能在android端的webView上成功配置Referer呢?  
2017-09-06 21:01 1 条评论 负责人:无 分享
已邀请:
s***@aliyun.com

s***@aliyun.com (作者)

   实在无奈,最后还是换了app支付。  
   H5支付在调起支付页面这一步的时候无论是openwindow还是获取原生webView打开亦或者使用android原生intent调用外部浏览器打开全都不行,我在网上查了有其他网友用原生调用H5支付的时候也出现了同样的问题,但是因为人家是原生,所以最后人家用外部浏览器打开了,并且还提示说不是所有的外部浏览器都能调起支付页面。我就这个问题问了微信客服也没有得到答复,现在也不知道这块究竟是MUI的问题还是微信的问题亦或是国内手机厂商自己封装的系统的问题。  
   如果有朋友还想研究这块的话可以试试看使用HttpClient能不能调起支付。  
   再做app支付的时候,踩到了两个坑,而且论坛上也有很多朋友出现的错误和我一样,在此分享下,希望能够对大家有所帮助。  
   第一个坑是微信的,访问统一下单接口后返回的参数里,随机字符串的key是**nonce_str**,而app发送给微信调起支付界面的参数里,随机字符串的key是**noncestr**,这点大家要注意。  
   第二个坑是自己的,因为我的后台服务器是java的,请求参数和回调参数都定义在静态常量里了,而调试的时候是将工程打包放在服务器上调试的,感觉是有没编译出来的class文件。我的感觉是我虽然把常量类的class文件放到服务器上了,但是引用常量的类文件class我并没有放到服务器上,导致引用的还是原来的常量(这块我不是太懂,好像是这样,但是感觉又说不通),所以为了保险起见,改完代码重新打包往服务器上放一般是最好的。
marting

marting

请问你的ios微信h5支付,支付完成后能返回到app吗??

  • 回梦無痕

    微信支付只要设置webview的Referer,即可达到支付之后调回APP内

    2018-05-26 20:35

  • marting

    回复 回梦無痕:referer这个怎么设置呢,可以贴点代码看下么??这个referer是要指定H5支付域名的那个地址啊?

    2018-05-28 08:56

  • marting

    然后这个好像在安卓环境是不用配置的,我之前试了安卓会自己返回到对应的app。但是在ios就一直跑到苹果浏览器,不知道这个原因是为什么,就是这个referer的问题么??

    2018-05-28 08:59

  • 回梦無痕

    回复 marting:安卓无需配置,因为安卓本来就是调用微信支付的一个类似于页面层的页面,支付之后关闭这个页面层,自然就显示你的APP

    2018-05-28 09:02

  • marting

    恩,ios的在哪里配置啊??

    2018-05-28 09:42

回梦無痕

回梦無痕 - 暂停服务

Referer要么为空,要么是你在微信支付配置设置的域名的地址。其他的不行

  • marting

    您好, app调用微信h5支付后,返回后app白屏的问题怎么处理吗?

    2018-05-30 14:02

1***@qq.com

1***@qq.com -

plus.payment.getChannels(function(channels) {
for(var i in channels) {
var channel = channels[i];
if(channel.id === 'wxpay') {
iap = channel;
}
}
getOrder();
}, function(e) {
console.log("获取支付通道失败:" + e.message);
});

用的app支付,在微信那边统一下单之后,用预会话id调起支付通道就ok了, 这里一共需要md5加密了两次,这个有点烦

该问题目前已经被锁定, 无法添加新回复