Android 接入微信支付

前言:

参考地址(做的时候有参考了以下两个博客的内容,自己按照实际情况,简化了些东西):

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:微信的注册信息
 * 

* 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
 * 

* 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:微信支付管理
 * 

* 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]

你可能感兴趣的:(Android 接入微信支付)