微信支付各种坑--终章(-1&-2)

         001.微信支付一路坑,走过一坑又一坑,总之,微信支付太过于坑爹,详细大家也或多或少遇到过,一路艰辛终于完美继承微信支付,下面进入填坑之路!!!

         002.一些微信平台的appid等这些就不多说了,自己去微信支付官网查看,错误码如下:

                微信支付官网链接说明

   
            

回调中errCode值列表:

名称 描述解决方案
0成功展示成功页面
-1错误可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2用户取消无需处理。发生场景:用户不支付了,点击取消,返回APP。

 

                     no01.去官网下载最新的sdk(必须)及demo,这个也会导致-1

                     no02.配置我们的WXPayEntryActivity该类必须放在包名.wxapi,比如com.weixin.test.wxapi.WXPayEntryActivity ,包名或类名不一致会造成无法回调,如下图

切记配置清单文件,(不必配置其他信息,有些配置<intent-filter>这个是非必需的加不加都没影响),exported=true这个必须配置,不配置回调会出问题

<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop">

                       no03.签名问题,一定要用在微信开发平台配置我们的app的正式签名(即你发布的app的签名,这个是必须),保证签名一致仔细检查,这个是-1常用问题,(可以用微信分享来验证签名正确与否,分享成功则说明签名没有问题,可往其他方向排查)

                       no04.我们和后台的交互,集成微信分享很简单,我们只需要拿到后台返回的参数请求即可,但是必须谨慎小心,看清每一个键值对,包括后台的2次签名、加密等一些问题(ios成功基本后台那边就没啥大问题了),参数不对微信支付回调失败或者莫名的一些问题,微信支付核心代码:

PayReq req = new PayReq();
try {
    req.appId = json.getString("appid");
    req.partnerId = json.getString("partnerid");
    req.prepayId = json.getString("prepayid");
    req.nonceStr = json.getString("noncestr");
    req.timeStamp = json.getString("timestamp");
    req.packageValue = json.getString("package");
    req.sign = json.getString("sign");
    req.extData = "app data"; // optional
    // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
    api.registerApp(APP_ID);//你前面添加了就不必再次添加
    api.sendReq(req);
    LogUtils.i(TAG, "掉微信支付,,,,,,,,");
} catch (JSONException e) {
    LogUtils.i(TAG, e.toString());
    e.printStackTrace();
}

                             no05.回调界面的基本配置,一个模式cv即可(可以在回调中做一些我们自己的操作):

                                      说明:* api.sendReq(req)后,不管微信的支付页面有没有调出来,最终都会来到这个WXPayEntryActivity页面 ,在这个页面,我们可以自己做一些事情,但是我这里就直接finish掉了*

public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {
    private IWXAPI api;
    private static final String APP_ID = "你申请的ID";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wxpay_entry);
        LogUtils.i(TAG, "onCreate" + "支付回调执行");
        api = WXAPIFactory.createWXAPI(this, APP_ID);
        api.handleIntent(getIntent(), this);
    }

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

    @Override
    public void onReq(BaseReq baseReq) {
        LogUtils.i(TAG, "baseReq:" + baseReq.toString() + "00000000000");
    }

    //支付结果回调
    @Override
    public void onResp(BaseResp baseResp) {
        LogUtils.i(TAG, "支付回调执行");
        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            if (baseResp.errCode == 0) {        
                showToastLong("支付成功!");
                Logi("baseReq:" + baseResp.errCode);
} else { showToastLong( "支付失败,请重新尝试!") ; Logi( "baseReq:" + baseResp. errCode) ; } finish() ; } }}

                                no06.切勿欣喜,运气好你的测试没有问题,但是还有坑,慎之又慎啊!就是还有一种情况,那就是我们开发者用debug模式安装到手机,然后跑了支付的功能,当然,这时候因为appId是用正式签名MD5码生成的,所以会返回 -1,然后你又换了个正式环境的,点破手机还是返回 -1 ,而且你确定之前正式包还是可以支付正常的,这时候你就蒙逼了,没错,这时候清下缓存这招就好使了或者卸载微信再安装城了,这个-1困扰我很久啊,但是这个错误只是针对我们开发者而言,因为客户不可能会安装这个debug包的!

               

               003.另外还有一种返回-2的情况就是我们在第一次点击支付,支付失败,没有调起支付界面直接调了WXPayEntryActivity

返回-2,第二次点击又支付成功了,,,,,一直这样循环,那么检查你是不是发送了2次请求,如果没有那你就清理缓存或者卸载微信!


                004.至此,微信支付的坑填平,欢迎大家讨论学习!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值