前言:
參考地址(做的時(shí)候有參考了以下兩個(gè)博客的內(nèi)容,自己按照實(shí)際情況,簡(jiǎn)化了些東西):
https://github.com/tsy12321/PayAndroid
http://loody.github.io/2014/12/21/2014-12-21-weixin-pay/
一、注意事項(xiàng):
微信開放平臺(tái)有個(gè)不成文的規(guī)定(文檔里沒有說明):
1、支付回調(diào)的Activity必須是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXPayEntryActivity.java
2、其他的接口(比如登錄、分享)回調(diào)的Activity必須是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXEntryActivity.java
3、兩個(gè)回調(diào)的Activity必須要實(shí)現(xiàn)IWXAPIEventHandler的接口
二、發(fā)起支付的關(guān)鍵代碼:
PayReq request = new PayReq();
request.appId = "微信appId";
request.partnerId = "收款方商戶id";
request.prepayId= "預(yù)支付訂單id";
request.packageValue = "Sign=WXPay";//死值
request.nonceStr= "隨機(jī)字符串";
request.timeStamp= "當(dāng)前時(shí)間戳";
request.sign= "簽名";
boolean checkArgs = request.checkArgs();
if(checkArgs ) {
mWXApi.sendReq(request);
}
三、以下為自己在項(xiàng)目中的實(shí)例:
因?yàn)轭A(yù)支付在服務(wù)器完成,所以這里只說客戶端的事情
/**
* Description:微信的注冊(cè)信息
* <p>
* Author: Zoe
* Time: 2017/2/20 0020 17:13
*/
public class WeChatConstants {
// APP_ID 替換為你的應(yīng)用從官方網(wǎng)站申請(qǐng)到的合法appId
public static final String APP_ID = "wxd930ea5d5a258f4f";
//支付狀態(tài)
public static final int PAY_ERROR = -1; //支付失敗
public static final int PAY_CACEL = -2; //支付取消
public static final int PAY_SUCCESS = 0; //支付成功
public static final int NO_OR_LOW_WX = 1; //未安裝微信或微信版本過低
public static final int ERROR_PAY_PARAM = 2; //支付參數(shù)錯(cuò)誤
public static final int ERROR_PAY = 3; //支付失敗
}
/**
* Description:微信支付回調(diào)Activity
* <p>
* Author: Zoe
* Time: 2017/2/20 0020 17:32
*/
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_weichat_pay_result);
if(WeChatManager.getInstance() != null) {
WeChatManager.getInstance().getWXApi().handleIntent(getIntent(), this);
} else {
finish();
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
if(WeChatManager.getInstance() != null) {
WeChatManager.getInstance().getWXApi().handleIntent(intent, this);
}
}
//當(dāng)微信發(fā)送請(qǐng)求到你的應(yīng)用,將通過IWXAPIEventHandler接口的onReq方法進(jìn)行回調(diào)
@Override
public void onReq(BaseReq baseReq) {
}
//應(yīng)用請(qǐng)求微信的響應(yīng)結(jié)果將通過onResp回調(diào)
//如果支付成功則調(diào)用支付結(jié)果查詢的接口,設(shè)置支付狀態(tài)
// 注意一定不能以客戶端返回作為用戶支付的結(jié)果,應(yīng)以服務(wù)器端的接收的支付通知或查詢API返回的結(jié)果為準(zhǔn)
@Override
public void onResp(BaseResp resp) {
Debug.i("wechat/////////onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (WeChatManager.getInstance() != null) {
if (resp.errStr != null) {
Debug.i("wechat////////errstr=" + resp.errStr);
WeChatManager.getInstance().onResp(resp.errCode);
finish();
}
}
}
}
}
/**
* Description:微信支付管理
* <p>
* Author: Zoe
* Time: 2017/2/20 0020 17:21
*/
public class WeChatManager {
private static WeChatManager mWXManager;
private IWXAPI mWXApi;
private String mPayParam;
private WXPayResultCallBack mCallback;
public static void init(Context context) {
if (mWXManager == null) {
mWXManager = new WeChatManager(context);
}
}
public WeChatManager(Context context) {
//通過WXAPIFactory工廠,獲取IWXAPI的實(shí)例
// IWXAPI 是第三方app和微信通信的openapi接口
mWXApi = WXAPIFactory.createWXAPI(context, WeChatConstants.APP_ID, true);
//將應(yīng)用的appId注冊(cè)到微信
mWXApi.registerApp(WeChatConstants.APP_ID);
}
public static WeChatManager getInstance() {
return mWXManager;
}
public IWXAPI getWXApi() {
return mWXApi;
}
public interface WXPayResultCallBack {
void onSuccess(); //支付成功
void onError(int error_code); //支付失敗
void onCancel(); //支付取消
}
/**
* 發(fā)起支付
*
* @param pay_param 由服務(wù)器返回
* @param callback
*/
public void doPay(String pay_param, WXPayResultCallBack callback) {
mPayParam = pay_param;
mCallback = callback;
if (!check()) {
if (mCallback != null) {
mCallback.onError(WeChatConstants.NO_OR_LOW_WX);
}
return;
}
JSONObject param = null;
try {
param = new JSONObject(mPayParam);
} catch (JSONException e) {
e.printStackTrace();
if (mCallback != null) {
mCallback.onError(WeChatConstants.ERROR_PAY_PARAM);
}
return;
}
if (TextUtils.isEmpty(param.optString("appid"))
|| TextUtils.isEmpty(param.optString("partnerid"))
|| TextUtils.isEmpty(param.optString("prepayid"))
|| TextUtils.isEmpty(param.optString("package"))
|| TextUtils.isEmpty(param.optString("noncestr"))
|| TextUtils.isEmpty(param.optString("timestamp"))
|| TextUtils.isEmpty(param.optString("sign"))) {
if (mCallback != null) {
mCallback.onError(WeChatConstants.ERROR_PAY_PARAM);
}
return;
}
PayReq req = new PayReq();
req.appId = param.optString("appid");
req.partnerId = param.optString("partnerid");
req.prepayId = param.optString("prepayid");
req.packageValue = param.optString("package");
req.nonceStr = param.optString("noncestr");
req.timeStamp = param.optString("timestamp");
req.sign = param.optString("sign");
mWXApi.sendReq(req);
}
/**
* 支付回調(diào)響應(yīng)
*
* @param error_code
*/
public void onResp(int error_code) {
if (mCallback == null) {
return;
}
if (error_code == WeChatConstants.PAY_SUCCESS) { //支付成功
mCallback.onSuccess();
} else if (error_code == WeChatConstants.PAY_ERROR) { //支付錯(cuò)誤
mCallback.onError(WeChatConstants.ERROR_PAY);
} else if (error_code == WeChatConstants.PAY_CACEL) { //支付取消
mCallback.onCancel();
}
mCallback = null;
}
/**
* 檢測(cè)是否支持微信支付
*
* @return
*/
private boolean check() {
return mWXApi.isWXAppInstalled() && mWXApi.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;
}
}
使用的時(shí)候,直接調(diào)用WeChatManager的doPay方法,在相應(yīng)的回調(diào)中做對(duì)應(yīng)的處理即可
示例:
/**
* 微信支付
* @param pay_param 支付服務(wù)生成的支付參數(shù)
*/
private void doWXPay(String pay_param) {
String wx_appid = "wxXXXXXXX"; //替換為自己的appid
WXPay.init(getApplicationContext(), wx_appid); //要在支付前調(diào)用
WXPay.getInstance().doPay(pay_param, new WXPay.WXPayResultCallBack() {
@Override
public void onSuccess() {
Debug.i("wechat/////////result////支付成功");
}
@Override
public void onError(int error_code) {
switch (error_code) {
case WXPay.NO_OR_LOW_WX:
Debug.i("wechat/////////result////未安裝微信或微信版本過低");
break;
case WXPay.ERROR_PAY_PARAM:
Debug.i("wechat/////////result////參數(shù)錯(cuò)誤");
break;
case WXPay.ERROR_PAY:
Debug.i("wechat/////////result////支付失敗");
break;
}
}
@Override
public void onCancel() {
Debug.i("wechat/////////result////支付取消");
}
});
}
最后附上微信開放平臺(tái)支付的調(diào)試工具:[http://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=pay/index]