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

用了2天的时间才把微信支付弄明白到底怎么回事,不容易啊。

先听我絮叨一下微信支付的具体流程:

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:需要把下单成功后的参数,按照特定的规则排列,这个规则就是,看下图:

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

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

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

APP代码比较简单如下:

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        api = WXAPIFactory.createWXAPI(this, appid,false);
        api.registerApp(appid);//注册appid
        api.handleIntent(getIntent(), this);
        Pay();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    private void Pay(){

        new Request().get(url, new Callback() {//发起web请求
            @Override
            public void finished(final String result) {
                if (null != result) {
                    
                    final Map map = gson.fromJson(result, Map.class);
                    if ("SUCCESS".equalsIgnoreCase((String) map.get("return_code"))) {
                        api.registerApp((String) map.get("appid"));
                        PayReq req = new PayReq();
                        req.appId = (String) map.get("appid");
                        req.partnerId = (String) map.get("partnerid");
                        req.prepayId = (String) map.get("prepayid");
                        req.packageValue = (String) map.get("package");
                        req.nonceStr = (String) map.get("noncestr");
                        req.timeStamp = (String) map.get("timestamp");
                        req.sign = (String) map.get("sign");
                        api.sendReq(req);
                    } else {
						Log.e("error-->", "FAIL");
                    }
                } else {  
					Log.e("error-->", "REQUEST FAIL");
                }
            }
        });
    }

    @Override
    public void onReq(BaseReq baseReq) { }

    @Override
    public void onResp(BaseResp baseResp) {
        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            //支付成功
           
        }else{
            //支付失败
            
        }
        
    }
}

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

这种目录结构才行。同时还要修改AndroidManifest.xml文件如下图:

请注意: android:exported="true"。还要注意代码里要有这2句如下图:


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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值