美文网首页
Android 接入微信支付

Android 接入微信支付

作者: 周南城 | 来源:发表于2017-02-22 19:07 被阅读158次

    前言:

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

    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]

    相关文章

      网友评论

          本文标题:Android 接入微信支付

          本文链接:https://www.haomeiwen.com/subject/ugimwttx.html