美文网首页技术干货Android知识Android开发
Android微信支付接入集成errCode-1解决

Android微信支付接入集成errCode-1解决

作者: 吃饱了就送 | 来源:发表于2017-09-06 15:54 被阅读0次

    这两天,公司APP需要做商城,所以需要接入支付功能。看了一下微信的官方文档,大概知道了流程。首先由服务端集成。集成完之后,客户端这边请求接口,会返回相应的字段,然后客户端拿着这些字段调起微信支付,完成支付。
    首先添加微信的依赖
    compile'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.1.6'
    然后,把demo里的payactivity拷贝过来。下面解释一下payactivity里的代码。

    //把APP注册到微信
    api= WXAPIFactory.createWXAPI(this,"APPID");
    api.registerApp("APPID");
    
    private void pay() {
    String url ="your servlet";
    Button payBtn = (Button) findViewById(R.id.appay_btn);
    payBtn.setEnabled(false);
    Toast.makeText(PayActivity.this,"获取订单中...", Toast.LENGTH_SHORT).show();
    try{
    byte[] buf = Util.httpGet(url);
    if(buf !=null&& buf.length>0) {
    String content =newString(buf);
    Log.e("get server pay params:",content);
    JSONObject json =newJSONObject(content);
    if(null!= json && !json.has("retcode") ){
    PayReq req =newPayReq();
    //req.appId = "wxf8b4f85f3a794e77";  // 测试用appId
    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
    Toast.makeText(PayActivity.this,"正常调起支付", Toast.LENGTH_SHORT).show();
    // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
    booleanb =api.sendReq(req);
    }else{
    Toast.makeText(PayActivity.this,"返回错误"+json.getString("retmsg"), Toast.LENGTH_SHORT).show();
    }
    }else{
    Toast.makeText(PayActivity.this,"服务器请求错误", Toast.LENGTH_SHORT).show();
    }
    }catch(Exception e){
    Toast.makeText(PayActivity.this,"异常:"+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
    payBtn.setEnabled(true);
    }
    

    这个方法就是微信Demo里,payactivity里主要的代码了。这里解释一下代码,url就是服务端集成完之后,给客户端调用的接口地址。会返回appId,parpayId.....拿到这些值给PayReq赋值,然后调用api.sendReq()调起支付。解释完代码,说一下可能遇到的问题。这些返回的参数,服务端是需要进行MD5加密的,如果没有加密,那么客户端拿到这些参数就需要进行加密。
    成功调起微信支付后,会跳转到一个界面,这个界面是必须有的,而且必须在wxapi包下。相信做过微信分享的朋友都清楚。

    @Override
    public void onResp(BaseResp resp) {
    if(resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
    AlertDialog.Builder builder =newAlertDialog.Builder(this);
    builder.setTitle(R.string.app_tip);
    builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
    builder.show();
    }
    }
    

    WXPayEntryActivity里代码比较简单,最重要的就是onResp方法了。resp.errCode是返回的错误码,微信给的描述比较模糊。-1的给的是可能的原因,让人摸不着头脑。我在集成的过程中,遇到三次-1。
    1,在清单文件中,WXpayEntryActivity没有加filter。
    2,签名的问题。在微信后台,我们会填写应用签名,相应的在调起微信支付,也需要用签名一致,而我们在开发的过程中,很可能用的debug的签名,所以也会报-1。
    然后就是在调起微信支付的时候,还会有个一个附加的参数extdata。我们在这个界面可以用getIntent().getStringExtra("_wxapi_payresp_extdata");获取在那里传的值。
    3,特批支付问题 ,走过很多弯路,正确的步骤是:给子商户邮件申请绑定appid,绑定成功后那个就是下单时的子商户appid,客户端不需要更改注册主商户appid,调起微信支付时appid用子商户

    相关文章

      网友评论

        本文标题:Android微信支付接入集成errCode-1解决

        本文链接:https://www.haomeiwen.com/subject/mhkvjxtx.html