接入微信支付相對支付寶支付要麻煩些,它和包名,簽名有關。更讓人難以理解的是類名和類所在的包名都是規定好的,不能改的,一改你就調不起微信支付。
包名和應用簽名的獲取
包名: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肯定是配置問題,不用懷疑
調不起微信支付問題排查
- 簽名的文件是否和申請時的一致,debug時是否用上了簽名文件
- appId,商戶號,request.sign是否和接口用的一樣
- WXPayEntryActivity建的目錄結構是否正確,是否真的是該包名路徑下建的,類名不能錯
換包名該如何修改
1、其實很簡單,WXPayEntryActivity類的目錄得建對。如下圖所示
2、appId,商戶號,request.sign得換新的
3、修改applicationId,修改簽名文件
如果發現調不起微信支付或者修改包名之後有問題可以加羣142739277或者我的QQ:893151960