畅聊微信支付遇到的坑

好久没更博了,甚是想念,工作的日子再也没有学校的那种悠闲,仕途一片迷茫,走一步看一步…

列出自己开发中微信遇到的坑

  1. 示例demo有坑爹的歧义
  2. 支付的回调操作
  3. 签名错误

示例demo有坑爹的歧义

刚接触微信支付文档的时候,是一种懵逼的状态,一般大家都会去找示例demo玩玩,讲真,我不建议大家看示例demo玩,里面的代码给开发者很多的误解,有的开发者看了代码,误以为订单的一些信息是前端去生成的,在支付中,是强烈不建议在前端去生成支付信息的,对于前端的支付,我们只需要关注PayReq这个类,所有的预支付订单信息是需要前端去后台请求的,然后前端去api.sendReq(req)调起微信支付,支付成功后,微信会将支付成功的信息异步回调给后台,后台来设置订单是够支付成功,但是,这个过程并不是真正的安全,还需要前端的配合,前端在微信支付成功后,回调的resp.errCode == 0表示支付成功,然后我们在这个回调中,拿着prepayId预支付id再去后台请求一次验证,我们必须要保证前端支付成功和后端异步回调成功要一致,这样才能保证支付的安全性。
还有就是,示例demo是eclipse项目……微信支付开发是没人了吗,没人去维护一下嘛,如果想把示例demo导入as项目的开发者,记住,把.9patch的图片的.9删了,全部改成jpg或是png结尾的图片,不然会报资源错误
然后就是,我们在看微信文档的时候只需要看APP端开发步骤这个部分就行了,这个部分思路特别的清晰,支付的库可以compile过来,既然这个部分讲解的这么好,为啥示例demo那么烂,什么鬼。

支付的回调操作

这个地方我是能说WTF,这是赤果果的独裁啊,我们在支付的回调配置中,回调类必须是包名下wxapi包下的WXPayEntryActivity类,举个例子cn.e8.wq.wxapi.WXPayEntryActivity,这是强制性的,一个字母都不能错,路径也不能错,不然唤起不了支付,这算是给微信做了一次广告吗。
还有就是,我们的应用会有很多的支付入口,每种入口支付成功后都会唤起不同的界面,微信所有的支付回调入口都是在WXPayEntryActivity类的onResp方法操作,比如,我想在A界面支付成功后跳C界面,B界面支付成功后跳D界面,你说,我肯定不能在回调里写死啊,你就说让我咋办吧,你说坑不坑,你看看别人家的支付,都是在当前页面请求,在当前页面回调,在当前页面做处理,你呢?偏偏多这一事
当然,这难不倒刻苦的开发者们,我们可以这么玩,在每次sendReq发送支付请求的时候,我们存储一个标志到SP里面,然后在微信回调的onResp中取出这个标志,然后做一系列的操作,比如,看看我的代码。

支付方法

    private void pay(PayWeixin.JsonDataBean pay) {
        req.appId = pay.getAppid();
        req.partnerId = pay.getPartnerid();
        req.prepayId = pay.getPrepayid();
        req.packageValue = pay.getPackag();
        req.nonceStr = pay.getNoncestr();
        req.timeStamp = pay.getTimestamp();
        req.sign = pay.getSign();
        api.sendReq(req);
        //支付之前存储当前的支付标记号
        SPUtils.getInstance(baseApp).push(SPUtils.KEY_PAY, SPUtils.PAY_shop);
    }

微信回调处理

    @SuppressLint("LongLogTag")
    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX && resp.errCode == 0) {
            String payTag = SPUtils.getInstance(this.getApplicationContext()).pop(SPUtils.KEY_PAY);
            switch (payTag) {
                case SPUtils.PAY_card:
                    EventBus.getDefault().post(new Card());
                    break;
                case SPUtils.PAY_zxing:
                    EventBus.getDefault().post(new Zxing());
                    break;
                case SPUtils.PAY_shop:
                    EventBus.getDefault().post(new Seller());
                    break;
                case SPUtils.PAY_order:
                    EventBus.getDefault().post(new Order());
                    break;
            }
        } else {
            Toast.makeText(this, "取消支付", Toast.LENGTH_SHORT).show();
        }
        finish();
    }

我这个地方因为业务的需求,所以就用EventBus去处理了,你看我最后有个finish,因为回调类是一个Activity类,为了不让用户感觉出来,我设置了这个类的主题为透明的,然后每次回调结束后都结束了这个Activity。

透明主题

android:theme="@android:style/Theme.Translucent.NoTitleBar"

签名错误

这个地方说实话,还不算是太坑的地方,首先我们要去下载一个签名工具,然后输入自己的包名,就可以看到签名了,有的开发者会遇到,我明明签名对的,包名对的,怎么请求支付还是返回-1签名错误,我来说说我遇到的。

一、我应用集成了微信分享的功能,如果我们的签名是错误的话,微信分享是绝对分享不了,这个地方我测试了,因为有几次,我经常改签名,分享好几次是失败的,还有就是,如果我们在微信平台更改签名,需要过一段时间才能用,,更改后就立马测试,绝对是返回-1,在测试的时候小伙伴的debug.ketstore和我不一样,这样就会导致两个人都不好测试,如何解决呢,签名呗,生成一个key.jks签名,将debug测试也指向正式包的配置,这样就不用老是去更改签名了

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            signingConfig signingConfigs.release
        }
    }

二、在微信支付中,回调类的路径一定要正确,不然会没反应,上面也说过这个问题了,我遇到的还有一个大大的坑,就是支付成功了,他不显示回调类,在我最开始接触的时候,我们支付成功后返回应用的时候,WXPayEntryActivity根本就没有被唤起,我根本无法去做处理,解决办法:WXPayEntryActivity也是一个Activity类,需要到清单文件去注册该类,我当时注册过了,还是发生了,主要是没有加 android:exported=”true”,加上去就好了

  <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTask"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"/>

三、这个问题你永远都想不到,前台微信分享都是成功的,配置都是正确的,然而,还是返回-1,我擦,能不能好好玩耍了,你可以告诉你一下你后台,是不是他生成的sign有问题,我们在测试的时候支付是可以用的,后台merge代码的时候,突然就没用了,我一度以为是我前端的原因,改签名,测试,发现分享是可以用的啊,签名是对的啊,怎么可能发生这种错误呢,我把测试的链接拿来用是可以支付的,后台,我去找后台review代码,果然,他们生成sign的时候,多加了两个字母,导致sign是错误的,所以,前端支付一直返回-1


如果还有遇到其他错误的,可以留言,最近想找个实习的岗位,求内荐

猜你喜欢

转载自blog.csdn.net/u013000152/article/details/78027760