Android实现微信支付和踩过的深坑

1.APP用户请求web url,这个url会去“微信商户平台”统一下订单。

2.下单以后返回一些数据,根据返回的数据,再去"微信APP"启动支付。

这其中涉及了3个sign(也叫签名的东西)。如果不知道签名的规则请:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 查看

第一个sign:  用户去“微信商户平台下单” 参数封装成一个xml,其中sign参数为:MD5(所有参数排序后+ key=微信商户平台的**)。


第二个sign: “微信商户平台”下单后,返回的sign,用于自己平台上对于微信返回的数据做校验。千万不要拿这个sign去启动“微信APP”支付(要不然就出提示:errCode = -1 的错误)。


第三个sign:需要把下单成功后的参数,按照特定的规则排列,这个规则就是,看下图:Android实现微信支付和踩过的深坑

参数名和参数值都不能错,必须是这样的 。然后根据 appid,partnerid,prepayid,package,noncestr,timestamp进行签名(sign)签名的规则为:MD5(这6个参数排序后+ key=微信商户平台的**)。加入sign参数后,再去加入其他参数。然后你的安卓APP根据获取到的参数来启动微信支付。(否则也会出现 errCode = -1 的错误)。

errCode -1:签名错误,所说的签名就是第三个sign。当然还有APPID未通过,和APPID注册的和返回的不一样,这个是“微信开放平台”里的东西。

所以说,如果看到3个sign都是不一样的前往不要吃惊。

APP代码比较简单如下:

[java] view plain copy
  1. public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{  
  2.       
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.          
  7.         api = WXAPIFactory.createWXAPI(this, appid,false);  
  8.         api.registerApp(appid);//注册appid  
  9.         api.handleIntent(getIntent(), this);  
  10.         Pay();  
  11.     }  
  12.   
  13.     @Override  
  14.     protected void onNewIntent(Intent intent) {  
  15.         super.onNewIntent(intent);  
  16.         setIntent(intent);  
  17.         api.handleIntent(intent, this);  
  18.     }  
  19.   
  20.     private void Pay(){  
  21.   
  22.         new Request().get(url, new Callback() {//发起web请求  
  23.             @Override  
  24.             public void finished(final String result) {  
  25.                 if (null != result) {  
  26.                       
  27.                     final Map map = gson.fromJson(result, Map.class);  
  28.                     if ("SUCCESS".equalsIgnoreCase((String) map.get("return_code"))) {  
  29.                         api.registerApp((String) map.get("appid"));  
  30.                         PayReq req = new PayReq();  
  31.                         req.appId = (String) map.get("appid");  
  32.                         req.partnerId = (String) map.get("partnerid");  
  33.                         req.prepayId = (String) map.get("prepayid");  
  34.                         req.packageValue = (String) map.get("package");  
  35.                         req.nonceStr = (String) map.get("noncestr");  
  36.                         req.timeStamp = (String) map.get("timestamp");  
  37.                         req.sign = (String) map.get("sign");  
  38.                         api.sendReq(req);  
  39.                     } else {  
  40.                         Log.e("error-->""FAIL");  
  41.                     }  
  42.                 } else {    
  43.                     Log.e("error-->""REQUEST FAIL");  
  44.                 }  
  45.             }  
  46.         });  
  47.     }  
  48.   
  49.     @Override  
  50.     public void onReq(BaseReq baseReq) { }  
  51.   
  52.     @Override  
  53.     public void onResp(BaseResp baseResp) {  
  54.         if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {  
  55.             //支付成功  
  56.              
  57.         }else{  
  58.             //支付失败  
  59.               
  60.         }  
  61.           
  62.     }  
  63. }  

如果出现微信支付成功但是未回调,onResp方法,请检查包名是否正确,微信支付和微信分享的回调必须如下图:
Android实现微信支付和踩过的深坑

这种目录结构才行。同时还要修改AndroidManifest.xml文件如下图:
Android实现微信支付和踩过的深坑

请注意: android:exported="true"。还要注意代码里要有这2句如下图:
Android实现微信支付和踩过的深坑


其他的应该都有返回错误的提示信息,都好解决。

鸣谢:https://blog.****.net/qilin001cs/article/details/75909756博主


1.APP用户请求web url,这个url会去“微信商户平台”统一下订单。

2.下单以后返回一些数据,根据返回的数据,再去"微信APP"启动支付。

这其中涉及了3个sign(也叫签名的东西)。如果不知道签名的规则请:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3 查看

第一个sign:  用户去“微信商户平台下单” 参数封装成一个xml,其中sign参数为:MD5(所有参数排序后+ key=微信商户平台的**)。


第二个sign: “微信商户平台”下单后,返回的sign,用于自己平台上对于微信返回的数据做校验。千万不要拿这个sign去启动“微信APP”支付(要不然就出提示:errCode = -1 的错误)。


第三个sign:需要把下单成功后的参数,按照特定的规则排列,这个规则就是,看下图:Android实现微信支付和踩过的深坑

参数名和参数值都不能错,必须是这样的 。然后根据 appid,partnerid,prepayid,package,noncestr,timestamp进行签名(sign)签名的规则为:MD5(这6个参数排序后+ key=微信商户平台的**)。加入sign参数后,再去加入其他参数。然后你的安卓APP根据获取到的参数来启动微信支付。(否则也会出现 errCode = -1 的错误)。

errCode -1:签名错误,所说的签名就是第三个sign。当然还有APPID未通过,和APPID注册的和返回的不一样,这个是“微信开放平台”里的东西。

所以说,如果看到3个sign都是不一样的前往不要吃惊。

APP代码比较简单如下:

[java] view plain copy
  1. public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{  
  2.       
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.          
  7.         api = WXAPIFactory.createWXAPI(this, appid,false);  
  8.         api.registerApp(appid);//注册appid  
  9.         api.handleIntent(getIntent(), this);  
  10.         Pay();  
  11.     }  
  12.   
  13.     @Override  
  14.     protected void onNewIntent(Intent intent) {  
  15.         super.onNewIntent(intent);  
  16.         setIntent(intent);  
  17.         api.handleIntent(intent, this);  
  18.     }  
  19.   
  20.     private void Pay(){  
  21.   
  22.         new Request().get(url, new Callback() {//发起web请求  
  23.             @Override  
  24.             public void finished(final String result) {  
  25.                 if (null != result) {  
  26.                       
  27.                     final Map map = gson.fromJson(result, Map.class);  
  28.                     if ("SUCCESS".equalsIgnoreCase((String) map.get("return_code"))) {  
  29.                         api.registerApp((String) map.get("appid"));  
  30.                         PayReq req = new PayReq();  
  31.                         req.appId = (String) map.get("appid");  
  32.                         req.partnerId = (String) map.get("partnerid");  
  33.                         req.prepayId = (String) map.get("prepayid");  
  34.                         req.packageValue = (String) map.get("package");  
  35.                         req.nonceStr = (String) map.get("noncestr");  
  36.                         req.timeStamp = (String) map.get("timestamp");  
  37.                         req.sign = (String) map.get("sign");  
  38.                         api.sendReq(req);  
  39.                     } else {  
  40.                         Log.e("error-->""FAIL");  
  41.                     }  
  42.                 } else {    
  43.                     Log.e("error-->""REQUEST FAIL");  
  44.                 }  
  45.             }  
  46.         });  
  47.     }  
  48.   
  49.     @Override  
  50.     public void onReq(BaseReq baseReq) { }  
  51.   
  52.     @Override  
  53.     public void onResp(BaseResp baseResp) {  
  54.         if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {  
  55.             //支付成功  
  56.              
  57.         }else{  
  58.             //支付失败  
  59.               
  60.         }  
  61.           
  62.     }  
  63. }  

如果出现微信支付成功但是未回调,onResp方法,请检查包名是否正确,微信支付和微信分享的回调必须如下图:
Android实现微信支付和踩过的深坑

这种目录结构才行。同时还要修改AndroidManifest.xml文件如下图:
Android实现微信支付和踩过的深坑

请注意: android:exported="true"。还要注意代码里要有这2句如下图:
Android实现微信支付和踩过的深坑


其他的应该都有返回错误的提示信息,都好解决。

鸣谢:https://blog.****.net/qilin001cs/article/details/75909756博主