流程:

1.app发起支付申请,请求服务器向微信发起预付订单处理(微信统一下单)。
2.请求成功后,服务器对预付订单进行签名并返回json数据给app(调起支付接口).
3.app拉起微信支付(获取到的支付通道拉起)。
4.支付成功后微信异步通知服务器支付结果。
5.app中进入订单支付结果页面(这里的数据重新与服务器确认是否支付成功)。

特别注意:

image.png

参数说明:

  • 登陆微信开放平台(注意是开放平台,不是公众平台);
  • 首先商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。
  • 注意看红框中的描述:

image.png

应用包名:就是Hbuilder中打包时填写的Android包名;
应用签名:
如果用的是DCloud公用证书,则微信应用签名为:”59201cf6589202cb2cdab26752472112”(全小写)
如果是自有证书,可根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具(下载地址)后,运行可生成应用签名串,获取应用签名方法参考文档:Android开发要点说明->第一步(后台设置)

应用包名获取步骤:hbuild—>发生—>云打包-打原生安装包

image.png

应用签名获取步骤:在手机端安装签名工具后—>运行—>输入应用包名(别搞错了不是app的名字)—得到应用签名

image.png

代码实现:

获取支付通道:

  1. // 初始化
  2. mui.plusReady(function() {
  3. // 获取支付通道
  4. plus.payment.getChannels(function(channels){
  5. //alert(channels[1].id)
  6. aliChannel=channels[0];
  7. wxChannel=channels[1];
  8. },function(e){
  9. mui.toast("获取支付通道失败:"+e.message);
  10. });
  11. })

获取手机的ip

  1. function getIp() {
  2. var ip = "127.0.0.1";
  3. var Context = plus.android.importClass("android.content.Context");
  4. if (plus.os.name == "Android") {
  5. //WifiManager
  6. var Context = plus.android.importClass("android.content.Context");
  7. var WifiManager = plus.android.importClass("android.net.wifi.WifiManager");
  8. var wifiManager = plus.android.runtimeMainActivity().getSystemService(Context.WIFI_SERVICE);
  9. var WifiInfo = plus.android.importClass("android.net.wifi.WifiInfo");
  10. if (!wifiManager.isWifiEnabled()) { //未连接wifi
  11. var Enumeration = plus.android.importClass("java.util.Enumeration");
  12. var NetworkInterface = plus.android.importClass("java.net.NetworkInterface");
  13. var Inet4Address = plus.android.importClass("java.net.Inet4Address");
  14. var en = NetworkInterface.getNetworkInterfaces();
  15. while (plus.android.invoke(en, "hasMoreElements")) {
  16. var ni = plus.android.invoke(en, "nextElement");
  17. var interfaceName = ni.getDisplayName();
  18. //console.log("tag", "网络名字" + interfaceName);
  19. var enumIpAddr = plus.android.invoke(ni, "getInetAddresses")
  20. while (plus.android.invoke(enumIpAddr, "hasMoreElements")) {
  21. var inetAddress = plus.android.invoke(enumIpAddr, "nextElement");
  22. if (!plus.android.invoke(inetAddress, "isLoopbackAddress") && inetAddress instanceof Inet4Address) {
  23. ip = plus.android.invoke(inetAddress, "getHostAddress");
  24. return ip;
  25. }
  26. }
  27. }
  28. } else { //连接wifi
  29. var wifiInfo = wifiManager.getConnectionInfo();
  30. ip = intToIp(wifiInfo.getIpAddress());
  31. var wifiInfo = wifiManager.getConnectionInfo();
  32. var ipAddress = wifiInfo.getIpAddress();
  33. ip = intToIp(ipAddress);
  34. }
  35. }
  36. return ip;
  37. }
  38. function intToIp(i) {
  39. return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + ((i >> 24) & 0xFF);
  40. }

发起请求

  1. //微信支付
  2. function wxPaymoney(name,money,ip){
  3. if(name=='alipay'){
  4. mui.toast('系统错误,请联系管理员');
  5. return;
  6. }
  7. alert(name+","+money+","+ip)
  8. mui.post(WXPAYSERVER, {
  9. MONEY:money,
  10. TOKEN:token,
  11. IP:ip
  12. }, function(res) {
  13. if (res.code==0) {
  14. alert(res.timeStamp)
  15. var param1 = {
  16. appid: res.appid,
  17. noncestr: res.nonce_str,
  18. package: res.packages,
  19. partnerid: res.partnerid,
  20. prepayid: res.prepay_id,
  21. sign: res.sign,
  22. timestamp: res.timeStamp
  23. };
  24. plus.payment.request(wxChannel,param1, function(result) {
  25. alert(JSON.stringify(result))
  26. mui.toast("付费成功");
  27. }, function(e) {
  28. alert(JSON.stringify(e))
  29. mui.toast("付费失败");
  30. });
  31. } else {
  32. mui.toast("支付失败");
  33. }
  34. });
  35. }

错误:

1.app微信支付报-1
image.png
首先请确保微信统一下单接口(如下图)这些字段返回的准确性。image.png
我们返回的-1,搞了一天最终发现是appid错误,后端在微信统一下单接口返加的appid错误,用的是公从号的appid,这里需要的是正在做的app项目的,记得还有一个地方需要用到appid(如下图位置)记得更改为正确的,真的是巨坑。

image.png

2.上个问题解决了又来一个新问题:商户支付权限被取消。
image.png

联系官方客服解决