各位亲们,笔者在王者荣耀里面年轻了几次(不知道为什么大家都叫我小学生,我好开心啊,年轻了10几岁)之后,跑来为大家分享两篇sdk集成的文章哈,因为各个大公司的集成sdk的文档。有的时候着实坑爹。也没客服电话。反正是,看了之后就想这么大的公司,为什么文档这么坑爹。或许大厂有大厂的考虑哈。第一篇,集成 微信 、 支付宝 的支付功能。
对了,立下个flag,以后所有的文章笔者的demo均上传 github 。前几天有一个小伙伴问我文章里的代码 出现 bug。但是,笔者完全找不到 demo,无法进行调试 ,场面一度尴尬。。。
一、 集成支付宝 SDK
支付宝文档路径
支付宝的文档很是详细,但是额,找到路径还是蛮难的。或许是笔者比较瞎吧。
1、下载与集成准备
下载路径:支付宝支付架包下载路径
下载完成之后将 下图文件拷贝到自己的项目:
拷贝到项目以下路径:
笔者将一些多余的文字删除了。
在主项目的 build.gradle 中,添加下面的内容,将 libs 目录作为依赖仓库:
allprojects {
repositories {
//引入 libs
flatDir {
dirs 'libs'
}
google()
jcenter()
}
}
在 App Module 的 build.gradle 中,添加下面的内容,将支付宝 SDK 作为项目依赖:
dependencies {
//引入支付宝 aar 文件
implementation (name: 'alipaySdk-15.5.9', ext: 'aar')
}
在清单配置文件内添加如下权限
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" />
如果你已经适配了 Android 6.0 以上设备 笔者希望你 申请如下动态权限WRITE_EXTERNAL_STORAGE
和 READ_PHONE_STATE
否则别怪笔者没有提醒你 会接收到意想不到的惊喜,比如说中个 500 万 啥的。
2、书写功能
首先 强调一点,调用支付宝支付接口 属于耗时操作,需要在工作线程进行调用。
1)、调起代码
//调用支付宝支付接口
private void startZfb() {
new Thread(new Runnable() {
@Override
public void run() {
//调用支付宝
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();
}
这里有一个字符串 form ,他服务器返给你的,所以不需要处理知己传给 支付宝的 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 = "支付结果未知,请联系客服";
break;
case "4000":
result = "订单支付失败";
break;
case "5000":
result = "重复请求";
break;
case "6001":
result = "订单取消成功";
break;
case "6002":
result = "网络连接出错";
break;
case "6004":
result = "支付结果未知,请联系客服";
break;
default:
result = "支付失败,请联系客服";
}
Toast.makeText(MyApplication.getContext(), result, Toast.LENGTH_LONG).show();
}
这里用到了弱引用 的相关代码 防止出现内存泄漏的问题。同样由于使用了弱引用,需要进行判空处理。否则 ,嘿嘿 后果自负。
调用成功的效果 ,就是这样的:
好了 支付宝的集成就到这里了。
二、微信支付 的集成
微信支付的集成相对了 支付更加简洁了。但是 开发文档。。。 笔者是个渣 不过多评论.。
官方链接:微信支付接入指南
1、导入 依赖
两种方式:
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
或者
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
前者包含统计功能。
2、准备工作
首先, 在你的项目的 包名的直系目录建立一个文件夹 文件夹名称为 “ wxapi”在 该文件夹下 创建一个Activity文件 文件名称为 “WXPayEntryActivity ”。 效果如下图:
3、代码工作
1)、将该 Activity 实现 IWXAPIEventHandler 接口 并实现相关方法;
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) {
}
//处理支付回调
@Override
public void onResp(BaseResp baseResp) {
}
}
4、激活支付界面
前期工作都准备好了,下面就是如何激活支付界面了
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(); //调起微信APP的对象
//下面是设置必要的参数,也就是前面说的参数,这几个参数从何而来请看上面说明
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);//发送调起微信的请求
}
}).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) {
}
//处理支付回调
@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("支付失败,请联系客服!");
} else {
// ToastUtils.showToast("支付取消!");
}
finish();
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
iwxapi.handleIntent(intent, this);
}
}
这里面就不放 效果图了,因为 ,笔者测试的App 没有申请相关的 微信需要的配置。
这里强调几点一定要注意 ,否则 微信 会 送你给 -1 大礼包 到怀疑人生。
1)、服务器返回的参数一定要 一一对应;
2)、签名一定要用正式版的签名(笔者就卡这里了,因为签名是后端大佬搞的);
3)、服务器那里二次 md5 生成一定要用点心。
项目地址:ZfbAndWxDemo