微信支付之Android篇

本篇中只会涉及Android端,不会涉及服务端,如果想了解服务端可以去看web篇。


单是前段接入支付相对简单,只要服务端能返回预支付订单,基本支付就完成了大半。在接入支付前我们需要先了解一下微信移动端的支付流程,这样才能更好的理解和接入微信支付。




以上就是一次微信支付的基本流程。


在开始编码前你需要准备好以下东西:

1. 接入支付的appid

2.微信Android端的demo(地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1)


在做好准备好我们就可以开始接入微信支付了。


 首先 ,让我们完成一些准备工作

1.你需要导入libammsdk.jar包(注:如果你友盟导入过友盟微信的相关包,这个包是不用导入的,否则可能会产生冲突

2.导入WXPayEntryActivity(注:这个activity必须放在wxapi的目录下,否则微信会找不到,如果你接入过微信分享,这个目录下应该还有一个WXEntryActivity

这个activity会在支付完成后调用

3.在AndroidManifest.xml中注册WXPayEntryActivity

 <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="此处填入你的appid" />
            </intent-filter>
        </activity>




接着让我们先看一我们需要用到哪些文件,把这些文件从demo中复制到你的项目中,基本需要修改的只有Constans.java和WXPay.java(demo中叫PayActivity.java


其中AppRegister.java和WXPay.java试必须文件,md5和Constans可以不用。(MD5是为了客户端签名用的,正式情况应该后台签名返给客户端

在Constans.java中我们只需要配置一下你的appid,当然你也可以在其他地方,这样这个文件基本可以舍弃不用

public class Constants {
	// APP_ID 替换为你的应用从官方网站申请到的合法appId
    public static final String APP_ID = "";

    public static class ShowMsgActivity {
		public static final String STitle = "showmsg_title";
		public static final String SMessage = "showmsg_message";
		public static final String BAThumbData = "showmsg_thumb_data";
	}
}


在WXPay.java中我们需要把你从后台拿到的预支付订单信息传过来,并以此填入,在这里我把预支付订单信息封装到了WXPayVo中,你也可以根据自己需要自己封装。在调用api.sendReq()后,如果所有信息正确,这时就可以调起微信支付界面。如果不正确你就需要自己排查了

注:微信支付时必须打正式包才可以,测试包无法完成支付

public class WXPay {
    Activity activity;
    private IWXAPI api;
    public void initPay(Activity activity1){
        activity = activity1;
        api = WXAPIFactory.createWXAPI(activity1, Constants.APP_ID);
        // 将该app注册到微信
        api.registerApp(Constants.APP_ID);
    }

    public void pay(WXPayVo wxPayVo){
        boolean isPaySupported = api.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;
        if(isPaySupported){
            if(null!= wxPayVo){
                PayReq req = new PayReq();
                //req.appId = "";  // 测试用appId
                req.appId			= Constants.APP_ID;
                req.partnerId		= wxPayVo.getMch_id();
                req.prepayId		= wxPayVo.getPrepay_id();
                req.nonceStr		= wxPayVo.getNonce_str();
                req.timeStamp       = wxPayVo.getTimestamp();
                req.packageValue	= "Sign=WXPay";
                req.sign            = wxPayVo.getSign();
                req.extData			= "app data"; // optional
                Toast.makeText(activity, R.string.tune_up_pay, Toast.LENGTH_SHORT).show();
                // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
                api.sendReq(req);
            }else {
                Toast.makeText(activity, R.string.get_prepayid_fail, Toast.LENGTH_SHORT).show();
            }
        }else {
            Toast.makeText(activity, R.string.no_support_pay, Toast.LENGTH_SHORT).show();
        }


    }

   /* private String genAppSign(List<NameValuePair> params,String apikey) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < params.size(); i++) {
            sb.append(params.get(i).getName());
            sb.append('=');
            sb.append(params.get(i).getValue());
            sb.append('&');
        }
        sb.append("key=");
        sb.append(apikey);

        String appSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
        Log.e("orion", appSign);
        return appSign;
    }*/



}

最后在你需要支付的地方调用以下代码就可以了:

WXPay wxPay = new WXPay();
wxPay.initPay(你的activity.this);
wxPay.pay(wxPayVo);

以下是预支付订单信息的bean,这个需要你和后台协商定义:

public class WXPayVo {
    private String appid;//这个是要求后台返回的并不在预支付订单中
    private String mch_id;
    private String prepay_id;
    private String nonce_str;
    private String package_value;
    private String sign;
    private String return_code;
    private String result_code;
    private String apikey;
    private String timestamp;


    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getApikey() {
        return apikey;
    }

    public void setApikey(String apikey) {
        this.apikey = apikey;
    }

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getReturn_code() {
        return return_code;
    }

    public void setReturn_code(String return_code) {
        this.return_code = return_code;
    }

    public String getResult_code() {
        return result_code;
    }

    public void setResult_code(String result_code) {
        this.result_code = result_code;
    }

    public String getMch_id() {
        return mch_id;
    }

    public void setMch_id(String mch_id) {
        this.mch_id = mch_id;
    }

    public String getPrepay_id() {
        return prepay_id;
    }

    public void setPrepay_id(String prepay_id) {
        this.prepay_id = prepay_id;
    }

    public String getNonce_str() {
        return nonce_str;
    }

    public void setNonce_str(String nonce_str) {
        this.nonce_str = nonce_str;
    }



    public String getPackage_value() {
        return package_value;
    }

    public void setPackage_value(String package_value) {
        this.package_value = package_value;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }
}









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值