微信支付之终级教程版,-1 问题全面分析

[TOP]
微信支付,说实话,做这个没有趟过水,踩过坑,三分钟搞定的还真没几人,简单是简单,但是…. 写官方文档的人比较懒,挖了不少坑!那么,我就写个3分钟上手的文章,就三分钟!

集成APP支付

一、下载SDK(当前最新3.1.1)和官方DEMO

二、集成支付环境

* 将jar包加到工程中,将demo中的WXPayEntryActivity.java 复制到自己工程中,注意了,要保持全包路径,也就是说你自己要建个 工程包名.wxapi这样的包路径,如下图,如然,别忘了在androidmainfest中注册这个activity. *

这里写图片描述
这样就算完成了集成支付环境了,剩下的就是操作api来完成支付功能

三、调起微信支付页面

 ** 首先来了解下APPID这玩意,这个是在开发者平台上创建应用时对应的一个appId,每个应用都是唯一的appId,关于创建应用     这一块,就没什么可讲的了**

步骤一:注册appId

    private IWXAPI msgApi;//操作各种功能的接口
    /**
    * 注册appId ,方式一:
    */
    private void initWXAPI(){
        //参数二:注册的appId,参数三:是否验证appId,第三个参数可要可不要,不过还是指定为false吧
        msgApi = WXAPIFactory.createWXAPI(AwardActivity.this,ValueConstants.APP_ID,false);
        //msgApi = WXAPIFactory.createWXAPI(AwardActivity.this,ValueConstants.APP_ID);
    }
    /**
    *注册appId,方式二:
    */  
    private void initWXAPI(){
        msgApi = WXAPIFactory.createWXAPI(AwardActivity.this,null);
        msgApi.registerApp(ValueConstants.APP_ID);
    }

步骤二:调起支付页面

        if (msgApi.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT) {
                PayReq request = new PayReq();
                request.appId =response.getString("appid");
                request.partnerId = response.getString("partnerid");
                request.prepayId= response.getString("prepayid");
                request.packageValue = "Sign=WXPay";
                request.nonceStr= response.getString("nonce_str");
                request.timeStamp= response.getString("timestamp");
                //这个sign参数一般是后台处理好后直接返回前端拿来用,但是也可以我们前端自己生成这个sign,
                //sign:把上面的参数按照首字母排序拼接,最后再加上申请的商户key,通边MD5加密后得到
                String str_sign="appid="+response.getString("appid")+"&"+
                        "noncestr="+response.getString("nonce_str")+"&"+
                        "package="+response.getString("package")+"&"+
                        "partnerid="+response.getString("partnerid")+"&"+
                        "prepayid="+response.getString("prepayid")+"&"+
                        "timestamp="+response.getString("timestamp")+"&"+
                        "key=saK23232323232323444ffddede";
                str_sign=MD5.getMessageDigest(str_sign.getBytes()).toUpperCase();
                request.sign= str_sign;

                MyLog.e("sign:"+str_sign);
                //这里打开支付页面
                msgApi.sendReq(request);
            }else{
                Toast.makeText(AwardActivity.this, "当前微信版本不支持支付功能", 0).show();
            }

四、支付完成

通过上面的步骤,就可以完成支付了,那么支付完了我们开发者怎么去拿到支付反馈信息呢,怎么进一步处理支付逻辑呢,还记得前面那个WXPayEntryActivity吗,是的,这个就是支付sdk完成支付会主动回调一个页面了,这也是为什么这个页面要按照定义好的包名来放的原因,那么,在这个类中,我们要做什么?

    private IWXAPI api;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pay_result);
        api = WXAPIFactory.createWXAPI(this,ValueConstants.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 req) {

    }
    // 0    成功  展示成功页面
    //-1    错误  可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
    //-2    用户取消    无需处理。发生场景:用户不支付了,点击取消,返回APP。
    @Override
    public void onResp(BaseResp resp) {
        MyLog.e("errCode = " + resp.errCode);
        Contants.payResult=resp.errCode;
        finish();
    }

是的,我们只需要关注这个onResp方法,通过resp.errCode去拿到支付结果0,-1,-2

* 注意了,msgApi.sendReq(request)后,不管微信的支付页面有没有调出来,最终都会来到这个WXPayEntryActivity页面 ,在这个页面,我们可以自己做一些事情,但是我这里就直接finish掉了,然后在调支付的页面这样处理的*

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        //调支付页面最好加个进度条,因为有时候很慢,造成无反应假像,然后在这里关闭。
        if (dialog!=null) {
            dialog.dismissProcessDialog();
        }
        if (contants.payResult==0) {
            setResult(RERESH);//去刷新前一个页面
            finish();
        }else if(NewMaterialApplication.getInstance().payResult==-1){
            Toast.makeText(this, "支付签名错误或appID未注册", 0).show();
        }else if(NewMaterialApplication.getInstance().payResult==-2){
            Toast.makeText(this, "已取消支付", 0).show();
        }
    }

当然通过这个支付返回码来判断是否真正支付成功是不正确的,最好要调后台的接口查一下是否真正支付成功了。

异常处理

很多小伙伴在玩这个支付的时候,100%会遇到返回 -1 这个错,我们来分析一下也就只有两种情况,
要么是appId有问题,要么是sign签名有问题
appId:
1、后台给你的有问题(首先自己登入开发者平台去看,不要相信后台人员说的)
2、误把公众号的appId拿来用了(有的人开发的时候有同时申请公众号)
3、sdk注册appId失败(这种情况没见过,但不排除)
sign:
后台返回的sign是不正确的(可以通过ios平台是否正常,或者像我上面那样自己签名),排除这个问题也不难,记住签名规则,保证key正确,最后还要注意一个地方,就是这个MD5加密方式,一定要用demo里的那个MD5类去加密,为什么呢,因为我就踩到这个坑里去了。很多有心得的朋友会说,出现 -1 清除下缓存啊,我想说,你不可能叫用户去清除下缓存吧,况且,清除缓存根本就没个鸟用!

这样就完美解决了 -1 这个坑了吗? NO,还有一种情况,那就是刚刚用工具debug安装到手机,然后跑了支付的功能,当然,这时候因为appId是用正式签名MD5码生成的,所以会返回 -1 ,然后你又换了个正式环境的,点破手机还是返回 -1 ,而且你确定之前正式包还是可以支付正常的,这时候你就蒙逼了,没错,这时候清下缓存这招就好使了,因为客户不可能会安装这个debug包的,所以,这种情况只会开发的时候出现!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一鱼浅游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值