本篇中只会涉及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;
}
}