前言:
参考地址(做的时候有参考了以下两个博客的内容,自己按照实际情况,简化了些东西):
https://github.com/tsy12321/PayAndroid
http://loody.github.io/2014/12/21/2014-12-21-weixin-pay/
一、注意事项:
微信开放平台有个不成文的规定(文档里没有说明):
1、支付回调的Activity必须是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXPayEntryActivity.java
2、其他的接口(比如登录、分享)回调的Activity必须是:你的包名(微信demo里是:net.sourceforge.simcpux)+.wxapi.WXEntryActivity.java
3、两个回调的Activity必须要实现IWXAPIEventHandler的接口
二、发起支付的关键代码:
PayReq request = new PayReq();
request.appId = "微信appId";
request.partnerId = "收款方商户id";
request.prepayId= "预支付订单id";
request.packageValue = "Sign=WXPay";//死值
request.nonceStr= "随机字符串";
request.timeStamp= "当前时间戳";
request.sign= "签名";
boolean checkArgs = request.checkArgs();
if(checkArgs ) {
mWXApi.sendReq(request);
}
三、以下为自己在项目中的实例:
因为预支付在服务器完成,所以这里只说客户端的事情
/**
* Description:微信的注册信息
* <p>
* Author: Zoe
* Time: 2017/2/20 0020 17:13
*/
public class WeChatConstants {
// APP_ID 替换为你的应用从官方网站申请到的合法appId
public static final String APP_ID = "wxd930ea5d5a258f4f";
//支付状态
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; //支付参数错误
public static final int ERROR_PAY = 3; //支付失败
}
/**
* Description:微信支付回调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);
}
}
//当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调
@Override
public void onReq(BaseReq baseReq) {
}
//应用请求微信的响应结果将通过onResp回调
//如果支付成功则调用支付结果查询的接口,设置支付状态
// 注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准
@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的实例
// IWXAPI 是第三方app和微信通信的openapi接口
mWXApi = WXAPIFactory.createWXAPI(context, WeChatConstants.APP_ID, true);
//将应用的appId注册到微信
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(); //支付取消
}
/**
* 发起支付
*
* @param pay_param 由服务器返回
* @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);
}
/**
* 支付回调响应
*
* @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) { //支付错误
mCallback.onError(WeChatConstants.ERROR_PAY);
} else if (error_code == WeChatConstants.PAY_CACEL) { //支付取消
mCallback.onCancel();
}
mCallback = null;
}
/**
* 检测是否支持微信支付
*
* @return
*/
private boolean check() {
return mWXApi.isWXAppInstalled() && mWXApi.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;
}
}
使用的时候,直接调用WeChatManager的doPay方法,在相应的回调中做对应的处理即可
示例:
/**
* 微信支付
* @param pay_param 支付服务生成的支付参数
*/
private void doWXPay(String pay_param) {
String wx_appid = "wxXXXXXXX"; //替换为自己的appid
WXPay.init(getApplicationContext(), wx_appid); //要在支付前调用
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////参数错误");
break;
case WXPay.ERROR_PAY:
Debug.i("wechat/////////result////支付失败");
break;
}
}
@Override
public void onCancel() {
Debug.i("wechat/////////result////支付取消");
}
});
}
最后附上微信开放平台支付的调试工具:[http://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=pay/index]