好了,多余的話不過多解釋,下面咋們大家一起來看看微信的SDK接入文檔
如果哥們急的話請調(diào)到:http://www.reibang.com/p/1015841aae48(直接下載Demo填寫正確信息直接調(diào)起支付)
更新第二版Demo:http://www.reibang.com/p/1015841aae48
排版2:http://www.reibang.com/p/c417ce674eb3
可能介入的不是太好,重在學習,學習哈,跟著我的思路來,一定要有耐心,微信坑很多,先看下參數(shù)(重要)
給一個獲取IP的地址: http://pv.sohu.com/cityjson?ie=utf-8
測試微信數(shù)據(jù)接口 : https://pay.weixin.qq.com/wiki/tools/signverify/
微信參數(shù)
Demo:鏈接: https://pan.baidu.com/s/1eS1tyWM 密碼: 3xih
WRNING!!!!
在類:WX_DATA_XINHAO_HAN設置微信信息
在類AliPay_XINHAO_HAN_DATA設置支付寶信息
appid: 你的APPID
mch_id : 商戶號
nonce_str : 生成的隨機字符串
body : 商品詳情
out_trade_no : 時間
total_fee : 金額
spbill_create_ip : IP地址
notify_url : 回調(diào)成功后調(diào)用的地址
trade_type : 支持類型(寫死 "APP")
步驟1:你先去注冊微信官網(wǎng)的一些信息然后獲取以下這3個東西
1.APPID 2.你的商戶號 3.秘鑰
就這幾個東西
基礎信息 nonce_str : 生成的隨機字符串
隨機字符串生成:
一般都是固定的,自己也懶得寫所以找了一個,如果要自己寫的話給你提供一些思路
首先把 A-Z 0-9 寫到一個String數(shù)組中,然后通過Random取索引 for 32次即可
我們看下網(wǎng)上的吧
MD5方法
代碼復制
排版真難受,這玩意連個代碼引用都沒有??????
這個使用方法是這樣的
代碼復制
```
//生成隨機字符串
public staticStringgenNonceStr() {
Random random =newRandom();
returnMD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
}
```
-----------------------
```
public final staticStringgetMessageDigest(byte[] buffer) {
charhexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
try{
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(buffer);
byte[] md = mdTemp.digest();
intj = md.length;
charstr[] =new char[j *2];
intk =0;
for(inti =0;i < j;i++) {
bytebyte0 = md[i];
str[k++] = hexDigits[byte0 >>>4&0xf];
str[k++] = hexDigits[byte0 &0xf];
}
return newString(str);
}catch(Exception e) {
return null;
}
}
```
基礎信息 out_trade_no : 時間
這個應該都會把,就是使用JAVA獲取你自己當前的時間格式為
比如:2017年7月17日就寫成2017717
基礎信息 spbill_create_ip : IP地址
使用網(wǎng)路訪問:http://pv.sohu.com/cityjson?ie=utf-8
會給你返回 var returnCitySN = {"cip": "219.144.202.177", "cid": "610100", "cname": "陜西省西安市"};
你自己截取一下就OK了
基礎信息 notify_url : 回調(diào)成功后調(diào)用的地址
后臺暫時沒有提供接口的話就隨便寫
基礎信息 mch_id : 商戶號?
你的商戶號
基礎信息 body : 商品詳情
隨意寫
基礎信息 total_fee : 金額
隨意寫
好了基本的功能數(shù)據(jù)都介紹完了
導入微信的Sdk
Android Studio適用
--------------------------------
compile'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
把剛才的幾個參數(shù)生成一下sign
到這里了,你會問OrederSendInfo info是個什么鬼??????
記住:WX_DATA_XINHAO_HAN.API_KEY 是你自己的秘鑰
別急老規(guī)矩先復制代碼
```
//生成預支付隨機簽名
public staticStringgenSign(OrederSendInfo info) {
StringBuffer sb =newStringBuffer(info.toString());
if(WX_DATA_XINHAO_HAN.API_KEY.equals("")) {
Toast.makeText(UIUtils.getContext(),"APP_ID為空",Toast.LENGTH_LONG).show();
}
//拼接密鑰
sb.append("key=");
sb.append(WX_DATA_XINHAO_HAN.API_KEY);
String appSign = MD5.getMessageDigest(sb.toString().getBytes());
Log.e("Sign-------------","genSign: "+ appSign.toUpperCase());
returnappSign.toUpperCase();
}
```
好了現(xiàn)在給你解釋一下這個是個什么鬼OrederSendInfo info方法參數(shù)
這個其實就是一個Bean
看代碼
```
public classOrederSendInfo {
privateStringappid;
privateStringmch_id;
privateStringnonce_str;
privateStringbody;
privateStringout_trade_no;
privateStringtotal_fee;
privateStringspbill_create_ip;
privateStringnotify_url;
privateStringtrade_type;
privateStringsign;
publicOrederSendInfo(String appid,String mch_id,String nonce_str,String body,String out_trade_no,String total_fee,String spbill_create_ip,String notify_url,String trade_type) {
this.appid= appid;
this.mch_id= mch_id;
this.nonce_str= nonce_str;
this.body= body;
this.out_trade_no= out_trade_no;
this.total_fee= total_fee;
this.spbill_create_ip= spbill_create_ip;
this.notify_url= notify_url;
this.trade_type= trade_type;
}
publicStringgetAppid() {
returnappid;
}
public voidsetAppid(String appid) {
this.appid= appid;
}
publicStringgetMch_id() {
returnmch_id;
}
public voidsetMch_id(String mch_id) {
this.mch_id= mch_id;
}
publicStringgetNonce_str() {
returnnonce_str;
}
public voidsetNonce_str(String nonce_str) {
this.nonce_str= nonce_str;
}
publicStringgetBody() {
returnbody;
}
public voidsetBody(String body) {
this.body= body;
}
publicStringgetOut_trade_no() {
returnout_trade_no;
}
public voidsetOut_trade_no(String out_trade_no) {
this.out_trade_no= out_trade_no;
}
publicStringgetTotal_fee() {
returntotal_fee;
}
public voidsetTotal_fee(String total_fee) {
this.total_fee= total_fee;
}
publicStringgetSpbill_create_ip() {
returnspbill_create_ip;
}
public voidsetSpbill_create_ip(String spbill_create_ip) {
this.spbill_create_ip= spbill_create_ip;
}
publicStringgetNotify_url() {
returnnotify_url;
}
public voidsetNotify_url(String notify_url) {
this.notify_url= notify_url;
}
publicStringgetTrade_type() {
returntrade_type;
}
public voidsetTrade_type(String trade_type) {
this.trade_type= trade_type;
}
publicStringgetSign() {
returnsign;
}
public voidsetSign(String sign) {
this.sign= sign;
}
//注意排序規(guī)則ASCII排序(一般按照A-Z,a-z)就行
@Override
publicStringtoString() {
return"appid="+appid+'&'+
"body="+body+'&'+
"mch_id="+mch_id+'&'+
"nonce_str="+nonce_str+'&'+
"notify_url="+notify_url+'&'+
"out_trade_no="+out_trade_no+'&'+
"spbill_create_ip="+spbill_create_ip+'&'+
"total_fee="+total_fee+'&'+
"trade_type="+trade_type+'&';
}
}
```
//記住在你調(diào)用的時候一定要在這個Bean里邊賦值,明白不,然后傳遞給sign的方法簽名就生成成功了
簽名生成完成了
這里邊有個XStream你可能找不到
在Studio里邊加入這段
```
compile ('com.thoughtworks.xstream:xstream:1.4.7') {
excludegroup:'xmlpull',module:'xmlpull'
}
```
重新編譯一下
代碼復制
```
public static voidUnfiedOrder(OrederSendInfo orederSendInfo, finalListerner listerner) {
//生成sign簽名
String sign = WXpayUtils.genSign(orederSendInfo);
//生成所需參數(shù)若治,為xml格式
orederSendInfo.setSign(sign.toUpperCase());
XStream xstream =newXStream();
xstream.alias("xml",OrederSendInfo.class);
finalString xml = xstream.toXML(orederSendInfo).replaceAll("__","_");
Log.e("xml---------------","UnfiedOrder: "+ xml);
//調(diào)起接口斗埂,獲取預支付ID
OkHttpUtils.ResultCallback resultCallback =newOkHttpUtils.ResultCallback() {
@Override
public voidonSuccess(String response) {
Log.e("返回的數(shù)據(jù)","onSuccess: "+ response);
String data = response;
data = data.replaceAll("","");
listerner.Success(data);
}
@Override
public voidonFailure(Exception e) {
listerner.Faiulre(e.toString());
}
};
try{
OkHttpUtils.post(WX_DATA_XINHAO_HAN.UNIFIED_ORDER,resultCallback, newString(xml.getBytes("UTF-8"),"ISO8859-1"));
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
}
```
至于里邊的Listnener
在這里
代碼復制
```
public interfaceListerner {
voidSuccess(String data);
voidFaiulre(String data);
}
```
拿到微信端的數(shù)據(jù)之后,直接掉起微信支付
開始填充數(shù)據(jù)
特別感謝:掘墓人
博客地址:http://www.reibang.com/p/9a3127cfda4d
我通過他所給的DEMO集成出了一套及簡單的Demo
下載地址: 鏈接: https://pan.baidu.com/s/1c2zURjq 密碼: jpr5
使用方法:你的這幾個部位可能會報錯注意,注意!!!!!!!!!!
因為微信很吊,你必須按照人家的來,直接在我那個工具包下創(chuàng)建一個Activity名字叫WXEntryActivity
你在你自己創(chuàng)建的Activity-->WXEntryActivity的這個方法下
直接復制這段代碼
```
WxMain.setStringOnListener(WXEntryActivity.this);
//如果是支付
WxMain.WXMessage wxMessage;
if(baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
intcode = baseResp.errCode;
switch(code) {
case0:
if(wxMessage!=null)
wxMessage.message("支付成功",0,"0.0");
//支付成功
break;
case-1:
if(wxMessage!=null)
wxMessage.message("支付失敗",-1,"0.0");
//支付失敗
finish();
break;
case-2:
if(wxMessage!=null)
wxMessage.message("支付取消",-2,"0.0");
//支付取消
finish();
break;
default:
if(wxMessage!=null)
wxMessage.message("支付失敗",-3,"0.0");
//支付失敗
setResult(RESULT_OK);
finish();
break;
}
return;
}
```
使用是這樣的:
第一個為你的商品描述,第二個為金額,回調(diào)只有0是成功的
0 成功
-1 支付失敗
-2 支付取消
-3 支付失敗
使用的話直接復制進去就可以了
總而言之微信相比之下還要比支付寶麻煩
說白了就是加密數(shù)據(jù)發(fā)送再給你解析一下數(shù)據(jù)然后在調(diào)起支付,大致就這兩個步驟
工具可能會用到的東西