首先檢查微信支付開放平臺有沒有創(chuàng)建項目军熏,里面的簽名(MD5簽名,不是SHA1卷扮,通過工具獲取最好)和包名是否一致荡澎,支付權(quán)限是否開通,debug包需要簽名realse的簽名晤锹,可以直接給debug配置release簽名摩幔,否則直接運行的debug的簽名和realse簽名是不一致的,會存在問題抖甘,ok了之后看下面流程
支付流程
1 引入包
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
2 調(diào)用
下面所有的參數(shù)都是服務(wù)器傳給你的,沒有一個是需要你自己獲取的葫慎,當(dāng)然如果你需要在客戶端做最后的簽名也是可以的
重點衔彻,怎么測試服務(wù)器給你的數(shù)據(jù)對不對?絕大多數(shù)-1錯誤碼都是服務(wù)器給的參數(shù)不對偷办,微信支付demo中有https://wxpay.wxutil.com/pub_v2/app/app_pay.php (不確定微信會不會跟換地址艰额,建議去demo里面找)這個地址是測試數(shù)據(jù),把測試的demo數(shù)據(jù)直接寫死到下面的參數(shù)中椒涯,如果可以請求成功柄沮,你的支付流程就沒有問題,當(dāng)前你首先需要先檢查微信開放平臺的MD5簽名是否對废岂,apikey祖搓,包名是否一致
服務(wù)器流程是這樣的,第一步你傳給他訂單的信息湖苞,比如價格什么的拯欧,服務(wù)器會對你的信息做簽名什么的然后向微信接口請求,微信接口會返回給服務(wù)器下面的商品信息以及簽名财骨,noncestr等
最重要的第三步镐作,服務(wù)器返回給你數(shù)據(jù)并不是直接把微信的返給他的數(shù)據(jù)直接返回給你,服務(wù)器需要把微信返回的數(shù)據(jù)再次簽名隆箩,這次生成的簽名才是最終的簽名该贾,是客戶端需要的簽名,最終簽名中用到的參數(shù)就是服務(wù)器需要返給客戶端的參數(shù)
{
"appid": "wxb4ba3c02aa476ea1",
"partnerid": "1900006771",
"package": "Sign=WXPay",
"noncestr": "6b3be5e19da289f4984639cb9a44f925",
"timestamp": 1565144431,
"prepayid": "wx071020313188630c79dcf66e1848742832",
"sign": "0896E1938417C2F0393E60FCD1F5DB0D"
}
IWXAPI api = WXAPIFactory.createWXAPI(MyMoneyActivity.this, null);
api.registerApp(LoginReadActivity.APP_ID);
PayReq req = new PayReq();
req.appId = appid/*"wxb475175b226bba0f"*/;//你的微信appid
req.partnerId = mch_id/*"1510166111"*/;//商戶號
req.prepayId =prepay_id/*"wx0616503763951401e44f8e8e1026290000"*/;//預(yù)支付交易會話ID
req.nonceStr = nonce_str/*"U3iEyfr82e79RxUEZQbRpQRKBYaBlnXo"*/;//隨機(jī)字符串
req.timeStamp =timestamp+"";//1565144431 時間戳
req.packageValue = "Sign=WXPay";//寫死捌臊,固定的
req.sign = sign/*"0896E1938417C2F0393E60FCD1F5DB0D"*/;//簽名
// req.extData = "app data"; // optional 這一行可以不要
api.sendReq(req);
3 編寫支付回調(diào),
(重要)這個回調(diào)activity名字必須是WXPayEntryActivity 杨蛋,看清楚是WXPayEntryActivity 不是WXEntryActivity
大多數(shù)調(diào)用微信支付沒有反應(yīng)是這個問題,也可能是你沒有下載微信
這個activity存放的位置必須是xxx(你的包).wxapi.WXEntryActivity不能改變
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, LoginReadActivity.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) {
}
@SuppressLint("LongLogTag")
@Override
public void onResp(BaseResp resp) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
/*
0 支付成功
-1 發(fā)生錯誤 可能的原因:簽名錯誤、未注冊APPID六荒、項目設(shè)置APPID不正確护姆、注冊的APPID與設(shè)置的不匹配、其他異常等掏击。
-2 用戶取消 發(fā)生場景:用戶不支付了卵皂,點擊取消,返回APP砚亭。
*/
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
// 根據(jù)返回碼
int code = resp.errCode;
switch (code) {
case 0:
// 去本地確認(rèn)支付結(jié)果
EventBus.getDefault().post("0");
finish();
break;
case -1:
Toast.makeText(this, "支付異常", Toast.LENGTH_SHORT).show();
finish();
break;
case -2:
Toast.makeText(this, "支付已取消", Toast.LENGTH_SHORT).show();
finish();
break;
default:
Toast.makeText(this, "支付失敗", Toast.LENGTH_SHORT).show();
finish();
break;
}
}
}