各位親們练慕,筆者在王者榮耀里面年輕了幾次(不知道為什么大家都叫我小學(xué)生惰匙,我好開心啊,年輕了10幾歲)之后贺待,跑來為大家分享兩篇sdk集成的文章哈徽曲,因?yàn)楦鱾€(gè)大公司的集成sdk的文檔。有的時(shí)候著實(shí)坑爹麸塞。也沒客服電話秃臣。反正是,看了之后就想這么大的公司哪工,為什么文檔這么坑爹奥此。或許大廠有大廠的考慮哈雁比。第一篇稚虎,集成 微信 、 支付寶 的支付功能偎捎。
對了蠢终,立下個(gè)flag序攘,以后所有的文章筆者的demo均上傳 github 。前幾天有一個(gè)小伙伴問我文章里的代碼 出現(xiàn) bug寻拂。但是程奠,筆者完全找不到 demo,無法進(jìn)行調(diào)試 祭钉,場面一度尷尬瞄沙。。慌核。
一距境、 集成支付寶 SDK
支付寶文檔路徑
支付寶的文檔很是詳細(xì),但是額垮卓,找到路徑還是蠻難的垫桂。或許是筆者比較瞎吧扒接。
1伪货、下載與集成準(zhǔn)備
下載路徑:支付寶支付架包下載路徑
下載完成之后將 下圖文件拷貝到自己的項(xiàng)目:
拷貝到項(xiàng)目以下路徑:
筆者將一些多余的文字刪除了。
在主項(xiàng)目的 build.gradle 中钾怔,添加下面的內(nèi)容碱呼,將 libs 目錄作為依賴倉庫:
allprojects {
repositories {
//引入 libs
flatDir {
dirs 'libs'
}
google()
jcenter()
}
}
在 App Module 的 build.gradle 中,添加下面的內(nèi)容宗侦,將支付寶 SDK 作為項(xiàng)目依賴:
dependencies {
//引入支付寶 aar 文件
implementation (name: 'alipaySdk-15.5.9', ext: 'aar')
}
在清單配置文件內(nèi)添加如下權(quán)限
android.permission.INTERNET
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.READ_PHONE_STATE
android.permission.WRITE_EXTERNAL_STORAGE
大概就是這樣的
<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" />
如果你已經(jīng)適配了 Android 6.0 以上設(shè)備 筆者希望你 申請如下動(dòng)態(tài)權(quán)限WRITE_EXTERNAL_STORAGE
和 READ_PHONE_STATE
否則別怪筆者沒有提醒你 會(huì)接收到意想不到的驚喜愚臀,比如說中個(gè) 500 萬 啥的。
2矾利、書寫功能
首先 強(qiáng)調(diào)一點(diǎn)姑裂,調(diào)用支付寶支付接口 屬于耗時(shí)操作,需要在工作線程進(jìn)行調(diào)用男旗。
1)舶斧、調(diào)起代碼
//調(diào)用支付寶支付接口
private void startZfb() {
new Thread(new Runnable() {
@Override
public void run() {
//調(diào)用支付寶
PayTask payTask = new PayTask(MainActivity.this);
String result = payTask.pay(from, false);
Message msg = new Message();
msg.what = 0;
msg.obj = result;
mHandler.sendMessage(msg);
}
}).start();
}
這里有一個(gè)字符串 form ,他服務(wù)器返給你的察皇,所以不需要處理知己傳給 支付寶的 sdk 就行了茴厉。就是這么簡單。
2)什荣、Handler 處理代碼
private static class MyHandler extends Handler {
private final WeakReference<MainActivity> mActivity;
private MyHandler(MainActivity mActivity) {
this.mActivity = new WeakReference<>(mActivity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity activity = mActivity.get();
if (activity != null) {
switch (msg.what) {
case 0:
String result = ((String) msg.obj).replace("{", "")
.replace("}", "").replace("resultStatus=", "")
.replace("memo=", "").replace("result=", "");
Log.d("MainActivity:", result);
String num = result.split(";")[0];
showPayDialog(num);
break;
}
}
}
}
//展示吐司
private static void showPayDialog(String num) {
String result;
switch (num) {
case "9000":
result = "訂單支付成功";
break;
case "8000":
result = "支付結(jié)果未知矾缓,請聯(lián)系客服";
break;
case "4000":
result = "訂單支付失敗";
break;
case "5000":
result = "重復(fù)請求";
break;
case "6001":
result = "訂單取消成功";
break;
case "6002":
result = "網(wǎng)絡(luò)連接出錯(cuò)";
break;
case "6004":
result = "支付結(jié)果未知,請聯(lián)系客服";
break;
default:
result = "支付失敗稻爬,請聯(lián)系客服";
}
Toast.makeText(MyApplication.getContext(), result, Toast.LENGTH_LONG).show();
}
這里用到了弱引用 的相關(guān)代碼 防止出現(xiàn)內(nèi)存泄漏的問題嗜闻。同樣由于使用了弱引用,需要進(jìn)行判空處理桅锄。否則 琉雳,嘿嘿 后果自負(fù)样眠。
調(diào)用成功的效果 ,就是這樣的:
好了 支付寶的集成就到這里了翠肘。
二吹缔、微信支付 的集成
微信支付的集成相對了 支付更加簡潔了。但是 開發(fā)文檔锯茄。。茶没。 筆者是個(gè)渣 不過多評論.肌幽。
官方鏈接:微信支付接入指南
1、導(dǎo)入 依賴
兩種方式:
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
或者
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
前者包含統(tǒng)計(jì)功能抓半。
2喂急、準(zhǔn)備工作
首先, 在你的項(xiàng)目的 包名的直系目錄建立一個(gè)文件夾 文件夾名稱為 “ wxapi”在 該文件夾下 創(chuàng)建一個(gè)Activity文件 文件名稱為 “WXPayEntryActivity ”笛求。 效果如下圖:
3廊移、代碼工作
1)、將該 Activity 實(shí)現(xiàn) IWXAPIEventHandler 接口 并實(shí)現(xiàn)相關(guān)方法探入;
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxpay_entry);
}
@Override
public void onReq(BaseReq baseReq) {
}
//處理支付回調(diào)
@Override
public void onResp(BaseResp baseResp) {
}
}
4狡孔、激活支付界面
前期工作都準(zhǔn)備好了,下面就是如何激活支付界面了
1蜂嗽、激活微信占用 Activity 的 界面代碼代碼
private void startWx() {
iwxapi = WXAPIFactory.createWXAPI(this, null);
iwxapi.registerApp("你的appId");
new Thread(new Runnable() {
@Override
public void run() {
PayReq request = new PayReq(); //調(diào)起微信APP的對象
//下面是設(shè)置必要的參數(shù)苗膝,也就是前面說的參數(shù),這幾個(gè)參數(shù)從何而來請看上面說明
request.appId = "你的appId";
request.partnerId = "1234";
request.prepayId = "1234";
request.packageValue = "Sign=WXPay";
request.nonceStr = "12324";
request.timeStamp = "1234";
request.sign = "1234567890987654";
iwxapi.sendReq(request);//發(fā)送調(diào)起微信的請求
}
}).start();
}
2、被激活的幾面代碼
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
private IWXAPI iwxapi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxpay_entry);
iwxapi = WXAPIFactory.createWXAPI(this, null);
iwxapi.registerApp("appId");
iwxapi.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
//處理支付回調(diào)
@Override
public void onResp(BaseResp baseResp) {
if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (baseResp.errCode == 0) {
//ToastUtils.showToast("支付成功");
} else if (baseResp.errCode == -1) {
// ToastUtils.showToast("支付失敗植旧,請聯(lián)系客服辱揭!");
} else {
// ToastUtils.showToast("支付取消!");
}
finish();
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
iwxapi.handleIntent(intent, this);
}
}
這里面就不放 效果圖了病附,因?yàn)?问窃,筆者測試的App 沒有申請相關(guān)的 微信需要的配置。
這里強(qiáng)調(diào)幾點(diǎn)一定要注意 完沪,否則 微信 會(huì) 送你給 -1 大禮包 到懷疑人生域庇。
1)、服務(wù)器返回的參數(shù)一定要 一一對應(yīng)丽焊;
2)较剃、簽名一定要用正式版的簽名(筆者就卡這里了,因?yàn)楹灻呛蠖舜罄懈愕模?br>
3)技健、服務(wù)器那里二次 md5 生成一定要用點(diǎn)心写穴。
項(xiàng)目地址:ZfbAndWxDemo