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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,799评论 25 707
  • 今天来聊聊,android中接入微信支付的需求,肯定有人会说,这多简单呀,还在这里扯什么,赶快去洗洗睡吧~~ 那我...
    SmileUsers阅读 37,916评论 26 76
  • 都说微信用户体验如何如何好,不知道他们有没有看过微信支付的开发文档。微信支付开发文档真垃圾。 我是准备将微信支付单...
    nashxk阅读 1,325评论 0 0
  • 今天早上老公又说起抽油烟机的角已经撞他头两次了,我家的抽油烟机是很老式的那种,我之前确实把那个角包起来过,因为之前...
    徐恺嵘阅读 178评论 0 0
  • 正念练习 柔和清晰的专注力 今天是正念日,也就是带着正念去感知一天的生活。正念起床,正念早餐,正念运动…… 一组群...
    悠悠然a阅读 164评论 0 1