接入微信支付

接入微信支付相對支付寶支付要麻煩些,它和包名,簽名有關。更讓人難以理解的是類名和類所在的包名都是規定好的,不能改的,一改你就調不起微信支付。

包名和應用簽名的獲取

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

應用簽名的獲取:因爲項目的app都是用360加固的,360加固上在加固應用時在任務詳情可以看到,簽名md5就是,它是大寫的,你弄成小寫就是了
如下圖:
在這裏插入圖片描述

萬一填錯了也可以改的,好像要等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<String, String> 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<String, String> 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類,目錄結構示例如下:
在這裏插入圖片描述

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類的目錄得建對。如下圖所示
在這裏插入圖片描述
2、appId,商戶號,request.sign得換新的
3、修改applicationId,修改簽名文件

如果發現調不起微信支付或者修改包名之後有問題可以加羣142739277或者我的QQ:893151960

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章