微信支付相信大家都接過,但是做過中間件的人來講微信就比較坑了阳藻,因?yàn)槲⑿胖Ц兜臅r候會去判斷包名是否和平臺上面的一致,現(xiàn)在SDK的解決方案只有兩種腥泥,一種是用H5來喚起微信支付,一種是插件形式,但今天寫的只是簡單的喚起微信支付立宜,至于SDK包名問題就有時間再寫了。
首先我們要接入微信支付先要去微信的開放平臺去申請對應(yīng)的參數(shù)橙数,包名和簽名要和微信的一致,不然會喚不起微信支付的崖技,至于這步就跳過了(一般都是專門負(fù)責(zé)去申請的),直接上教程迎献。
1腻贰、把開發(fā)工具包中l(wèi)ibs目錄下的libammsdk.jar復(fù)制到該目錄中
2、需要在AndroidManifest.xml 配置權(quán)限
<pre>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</pre>
3冀瓦、在你的包名相應(yīng)目錄下新建一個wxapi目錄写烤,并在該wxapi目錄下新增一個WXEntryActivity(沒有什么特別需要這個直接在文檔復(fù)制過去就好了)假如你的包名是:com.Android.test,新建后com.android.text.wxapi洲炊,在wxapi新建一個WXEntryActivity(我是直接copy過去的),包名必須是wxapi
4蓝厌、在你的AndroidManifest.xml 配置
<pre>
<activity android:name="com.shuguo.sgsdk.wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"
/>
</pre>
5古徒、微信需要的參數(shù)(后臺返回)
ps: 我是使用okHttp3框架訪問后臺的
<pre>
客戶端代碼:
// PAY_NET_URL 服務(wù)端地址
// 將參數(shù)發(fā)送到服務(wù)端 (要什么參數(shù)需要和后臺溝通下,這里不是一定的)
RequestCall requestCall = OkHttpUtils.get().url(Constants.PAY_NET_URL)
.addParams("userID", uid)
.addParams("appID", appid)
.addParams("productID", productID + "")
.addParams("productName", productName)
.addParams("productDesc", productDesc)
.addParams("money", price)
.addParams("roleID", roleID)
.addParams("roleName", roleName)
.addParams("serverID", serverId)
.addParams("serverName", serverName)
.addParams("payID", "" + 2)
.addParams("orderId", orderId)
.addParams("notifyUrl", payNotifyURL)
.build();
requestCall.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int i) {
Log.e("requestCall is onError", e.getMessage());
Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_SHORT).show();
}
// 服務(wù)端返回過來的數(shù)據(jù)用來喚起微信支付
@Override
public void onResponse(String jsonObject, int i) {
if (jsonObject != null) {
try {
// 這里使用Gson解析
WeChatJson json = new Gson().fromJson(jsonObject, WeChatJson.class);
if (json.getData() != null && json.getData().getExtension() != null) {
WeChatJson.DataBean.ExtensionBean extensionBean = json.getData().getExtension();
// 我把注冊到微信放在這里
api.registerApp(extensionBean.getAppid());
PayReq request = new PayReq();
request.appId = extensionBean.getAppid();
request.partnerId = extensionBean.getPartnerid();
request.prepayId = extensionBean.getPrepayid();
request.packageValue = extensionBean.getPackageX();
request.nonceStr = extensionBean.getNoncestr();
request.timeStamp = extensionBean.getTimestamp();
request.sign = extensionBean.getSign();
// 喚起微信支付
api.sendReq(request);
}
} catch (Exception e) {
Toast.makeText(mContext,"訂單獲取失敗",Toast.LENGTH_SHORT).show();
processTip.hide();
e.printStackTrace();
}finally {
}
}else {
}
}
});
</pre>
WeChatJson.java
<pre>
public class WeChatJson {
private DataBean data;
private int state;
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public static class DataBean {
private ExtensionBean extension;
private long orderID;
public String getAppID() {
return appID;
}
public void setAppID(String appID) {
this.appID = appID;
}
private String appID;
public ExtensionBean getExtension() {
return extension;
}
public void setExtension(ExtensionBean extension) {
this.extension = extension;
}
public long getOrderID() {
return orderID;
}
public void setOrderID(long orderID) {
this.orderID = orderID;
}
public static class ExtensionBean {
@SerializedName("package")
private String packageX;
private String appid;
private String sign;
private String partnerid;
private String prepayid;
private String noncestr;
private String timestamp;
public String getPackageX() {
return packageX;
}
public void setPackageX(String packageX) {
this.packageX = packageX;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getPartnerid() {
return partnerid;
}
public void setPartnerid(String partnerid) {
this.partnerid = partnerid;
}
public String getPrepayid() {
return prepayid;
}
public void setPrepayid(String prepayid) {
this.prepayid = prepayid;
}
public String getNoncestr() {
return noncestr;
}
public void setNoncestr(String noncestr) {
this.noncestr = noncestr;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
}
}
}
</per>
到這里就結(jié)束了寺惫,如果喚不起微信支付西雀,請檢查請求參數(shù)和包名是否有誤。