手把手教你 集成支付宝、微信支付功能 SDK

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xiangshiweiyu_hd/article/details/86636052

各位亲们,笔者在王者荣耀里面年轻了几次(不知道为什么大家都叫我小学生,我好开心啊,年轻了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_STORAGEREAD_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

猜你喜欢

转载自blog.csdn.net/xiangshiweiyu_hd/article/details/86636052