app接入微信第三方支付详解以及坑

上一篇文章我们介绍了支付宝的接入,这一篇我们正式介绍一下app怎么接入微信支付功能

正文

微信sdk下载
微信支付文档
微信签名工具app
首先我们微信和支付宝一样,都需要导入相应的sdk 微信sdk下载 ,下载完成后正常导入即可。这里微信是不支持沙箱环境的。

一般会遇到的问题:(这里我说了几个比较常见的坑)

  • 微信第一次调用成功以后,后面调用会返回失败,或者没有响应。
  • key签名文件与微信服务器上不匹配。
  • 明明key签名文件与微信服务器上一致,但就是提示你不匹配。
    解:微信支付当必须用真机测试,其次当你的app第一次拉取微信支付的时候,微信会去请求服务器,但是当你第二次再拉取支付的时候,微信会直接读本地缓存,所以当你第一次签名不正确,然后你去微信后台更改了正确的签名依旧失败的情况,就是读取了缓存,这个时候你应该清楚掉手机微信的所有数据即可,当然这里建议不要用自己手机测试哦,不然你微信数据可就全没了。 那么这里我再提一下我们微信支付在后台给的签名应该是哪一个,是我们as默认的那个sha1签名吗,不是。是我们打包时候用的key.jks的sha1吗,也不是。那么我们怎么获取签名,我们应该把app安装到手机以后,然后安装 微信签名工具app,然后打开签名工具找到我们的app,然后获取到签名,把这个签名写到微信后台就对了。(更改签名是即时生效的哦)。

使用

说完了一些坑,那么现在来说一下微信怎么调用,怎么接收回调支付结果。
先来看一下我封的调用
这里看到有一堆字段,以及最后面有一个sign签名,如果你下载了微信的demo,里面你可能会找到相应的算法,但是你在移动端不需要,我们一般的逻辑都是交给服务器去计算,移动端只拿最后的结果进行调用,这也是为了安全考虑,因为计算会用到一些appId 以及商户号等,所以这里只需要这么点东西调用。

public class WXPayUtils {

 public void init(){
        //支付初始化 init
        api = WXAPIFactory.createWXAPI(context, APIID);
        PayReq request = new PayReq();
        request.appId = APIID;
        request.partnerId = PARTNERID;
        request.prepayId= PREPAYID;
        request.packageValue = PACKAGEVALUE;
        request.nonceStr= NONCESTR;
        request.timeStamp= TIMESTAMP;
        request.sign= SIGN;
        //发起微信支付调用
        boolean bpp = api.sendReq(request);
    }
}

调用完以后,我们该怎么接收,微信接收和支付宝不同,微信需要你新建一个包并且包名叫 wxapi 里面新建一个WXPayEntryActivity的类,回调结果会在这里接收。
这里我们会在onResp方法中接收到支付回调,状态有三种, //0成功 -1错误 -2用户取消,相应做不同处理。

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pay_result);
        api = WXAPIFactory.createWXAPI(this, PayConstant.WXAPPID);
        api.handleIntent(getIntent(), this);
    }

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

    @Override
    public void onReq(BaseReq req) {
    }

    @Override
    public void onResp(BaseResp resp) {
        //0成功 -1错误 -2用户取消
        System.out.println("微信结果:"+ConstantsAPI.COMMAND_PAY_BY_WX);
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            switch (resp.errCode) {
                case 0:
                    //与服务器进行验证是否成功
                    //如果服务器返回成功则跳转到付款成功界面
                    //否则按照失败处理
                    OrderQuery(WXPayUtils.orderid);
                    break;
                case -1:
                    //错误情况跳转到付款失败界面请用户前往个人中心查看订单详情
                    jump();
                    break;
                case -2:
                    //用户手动取消了付款
                    jump();
                    break;
            }
        }
    }

    private void jump(){
        ....
    }

    //验证是否成功
    private void OrderQuery(final String id) {
       ......
    }

}

那么整个微信支付的内容就提到这里,喜欢的点个赞吧,谢谢。
这里整个支付逻辑流程的话与支付宝一样,上一篇我也说了一个支付逻辑的流程。有兴趣可以去看一下上一篇文章结尾处有提到。

发布了22 篇原创文章 · 获赞 4 · 访问量 1776

猜你喜欢

转载自blog.csdn.net/weixin_41078100/article/details/104531944
今日推荐