接入微信支付

接入微信支付相对支付宝支付要麻烦些,它和包名,签名有关。更让人难以理解的是类名和类所在的包名都是规定好的,不能改的,一改你就调不起微信支付。

官方文档地址

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3

包名和应用签名的获取

包名:build.gradle文件中的applicationId而不是AndroidManifest.xml中的package。以后凡是说到包名都是applicationId。

应用签名的获取:因为项目的app都是用360加固的,360加固上在加固应用时在任务详情可以看到,签名md5就是,它是大写的,你弄成小写就是了
如下图:

}AVUQMP~Z6BS1~TA0K@H%5P.png

万一填错了也可以改的,好像要等1天才能修改成功

依赖以及相关配置

在app下build.gradle文件中,添加如下依赖即可

    dependencies {

compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

}

在Application中初始化先向微信注册您的APPID

private void initWxPay() {
    //初始化微信api
    wxapi = WXAPIFactory.createWXAPI(this, WxPayUtils.getWxAppId(), false);
    //注册appid
    wxapi.registerApp(WxPayUtils.getWxAppId());
}

调起微信支付

示例代码:

public static void wxPay(Context context, final String prepqyId) {
    if (MyApplication.getWxapi().isWXAppInstalled()) {
        Thread payThread = new Thread() {
            @Override
            public void run() {
                PayReq request = new PayReq();
                request.appId = WxPayUtils.getWxAppId();
                request.partnerId = WxPayUtils.getWxMchId();
                request.prepayId = prepqyId;
                request.packageValue = "Sign=WXPay";
                request.nonceStr = WxPayUtils.getNumSmallLetter();
                request.timeStamp = (System.currentTimeMillis() / 1000) + "";
                SortedMap map = new TreeMap();
                map.put("appid", request.appId);
                map.put("partnerid", request.partnerId);
                map.put("prepayid", request.prepayId);
                map.put("package", request.packageValue);
                map.put("noncestr", request.nonceStr);
                map.put("timestamp", request.timeStamp);
                request.sign = WxPayUtils.createMD5Sign(map);
                MyApplication.getWxapi().sendReq(request);
            }
        };
        payThread.start();
    } else {
        ToastUtils.show(context.getString(R.string.wx_unInstalled));
    }


}

public static String createMD5Sign(SortedMap map) {
    StringBuilder sb = new StringBuilder();
    Set es = map.entrySet();
    Iterator it = es.iterator();
    while (it.hasNext()) {
        Map.Entry entry = (Map.Entry) it.next();
        String k = (String) entry.getKey();
        String v = (String) entry.getValue();
        sb.append(k + "=" + v + "&");
    }
    String params = sb.append("key=" + getWxSignKey()).substring(0);
    String sign = MD5Encode(params, "utf8");
    sign = sign.toUpperCase();
    return sign;
}

其中getWxAppId是申请的appId,getWxMchId是商户号,在微信支付后面查看详情中可查看
createMD5Sign()方法是接口给的,就是和接口一样的,可以问下服务器端同事。其中getWxsignKey也是接口给或者是申请微信支付的人弄的,它是用来加密各个请求的参数的,它必须和接口用的是一样的。这个我也不知道在那查看

处理支付结果回调

建WXPayEntryActivity类,目录结构示例如下:

)C1Z(@OA}PMXKH)8VM8X_07.png
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {


private IWXAPI api;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    api = MyApplication.getWxapi();
    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) {

    if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
    //errCode为0是支付成功,其他都是失败
        if (resp.errCode == WxPayUtils.PAY_SUCCESS_CODE) {
            //支付成功
            LogUtils.v("wxpayy", "支付成功");
            //去后台查询订单结果
        } else {
            //支付失败
            LogUtils.v("wxpayy", "支付失败");
            LogUtils.v("wxpayy", resp.errCode + "/");
            //根据错误code排查问题
        }
    }
    finish();
}}

注意

resp.errCode为-1肯定是配置问题,不用怀疑

调不起微信支付问题排查

  1. 签名的文件是否和申请时的一致,debug时是否用上了签名文件
  2. appId,商户号,request.sign是否和接口用的一样
  3. WXPayEntryActivity建的目录结构是否正确,是否真的是该包名路径下建的,类名不能错

换包名该如何修改

1、其实很简单,WXPayEntryActivity类的目录得建对。如下图所示

7NHW7VRTZ9~9}(ZEK98SAFT.png

2、appId,商户号,request.sign得换新的
3、修改applicationId,修改签名文件

如果发现调不起微信支付或者修改包名之后有问题可以私信我

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注