Android Study 之 6分钟妥妥集成微信以及支付宝支付

LZ-Says:来说俩件事儿:

1.一心只为一人用,一言只为一人说~

2.今天坐公交,末班车,车上只有司机和我,阴森森的,吓死LZ了。。。一路小跑!!!

前言 (浪费一分钟)

今天,不讲这个,也不讲那个,那么讲点啥呢?

这里写图片描述

嘿嘿嘿,讲讲如何在5分钟之内,快速,成功,集成微信以及支付宝支付吧~~~

这里写图片描述

查看效果

有图不上,非君子~~

这里写图片描述

支付思路

微信支付,支付宝支付,其实思路都是一样的,很简单,却很重要,如下:

首先大家需要注意的一点是,APP端不能留有任何关于支付宝以及微信对应的key的关键配置,而需要将这些内容放置在后台进行配置管理,原因是App容易受到反编译以及破解的风险,所以放置在服务器端进行配置管理相对来说比较安全,但这只是相对而言!

  • App端点击支付,调用服务端提供支付接口,传入当前项目所需金额以及数量等内容;

  • 服务端接收到App传入的支付信息,通过加签加密等等将当前接收内容发送微信或者支付宝服务器,接收返回结果;

  • App端接收到的服务端信息,通过官方文档提供如何调起对应客户端进行对应的参数配置;

  • 用户输入完密码,代表订单完成,对应的我们的服务端以及App端都会接收到回调结果,从而代表一切OK~

微信支付(预计4分钟即可)

首先,关注一波官方文档:

1. 微信支付 Android 接入指南
2. 微信支付API
3. demo下载地址
4. 资源下载地址

啧啧,浪费了一分钟~

为什么LZ说浪费呢?

这里不得不吐槽一波:

没做微信支付前,感觉BAT公司肯定和其他的不一样,至少接入的文档会让人感觉不知不觉,WC,好了~~~

结果,惨的一B,说多都是泪!!!(再次希望官方能够认认真真完善下文档~~~浪费了0.5分钟!!!)

本文省去微信支付前期操作,例如申请账号,配置签名,通过审核等等,这些就不说了。具体原因:

LZ所在公司,这些都是属于保密,当然也可以理解为LZ没有权限操作这些事儿,虽然知道相对应的步骤,但是本着最基本的原则,这里还是不说了,希望以后可以真正接触下,虽说简单,但是还是要亲历亲为下较好`

还有一分钟,我们一起来看,如何快速集成`

添加远程依赖

之前方式,各位可以下载相关SDK,But,现在我们可以直接使用远程依赖库方式直接引用,如下:

compile ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’

改造Build文件,新增签名配置

关于以下内容,有兴趣的可以查看LZ之前学习从而总结的博文:

Android 技巧之如何一个key玩转第三方服务(微信支付、某某地图)正式以及测试所需不同的key

下面简单附上当前LZ所使用的配置:

    // 签名配置
    signingConfigs {
        release {
            try {
                storeFile file("./keystore/正式证书.jks")
                storePassword "storePassword"
                keyAlias "keyAlias"
                keyPassword "keyPassword"
            } catch (ex) {
                throw new InvalidUserDataException(ex.toString())
            }
        }
        debug {
            storeFile file("./keystore/测试-debug.jks")
        }
    }

有的小伙伴说了,我可以不配置吗?

LZ说,当然可以,只要你不嫌测试麻烦~啦啦啦~
添加必要权限

权限,这个肯定是必须的啦~

<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"/>
创建微信指定文件

在项目根目录下创建如下文件:

这里写图片描述

重点:

必须在项目目录下创建wxapi,以及此目录下的WXPayEntryActivity文件!!!

  • Do not ask me why?

  • 微信就这么屌!!!

而这个WXPayEntryActivity主要做的事儿,便是接收调起微信之后的结果,关于这点,不得不说,微信的坑啊,一起来看看关于返回结果Code码的解释:

这里写图片描述

就问你无奈不。。。

下面一起来看WXPayEntryActivity这个文件里面主要干了什么吧~


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

/**
 * author : HLQ
 * e-mail : 925954424@qq.com
 * time   : 2018/02/02
 * desc   : 微信支付
 * version: 1.0
 */
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;
    private static final String APP_ID = "YOU_APP_ID";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, APP_ID);
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {
    }

    /**
     * 得到支付结果回调
     */
    @Override
    public void onResp(BaseResp resp) {
        String result;
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                result = "支付成功,开始采集吧~";
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = "已取消支付,请完成支付后进行采集~";
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = "支付中断,请完成支付后进行采集~";
                break;
            default:
                result = "支付异常,请完成支付后进行采集~";
                break;
        }
        UIHelper.getSystemHintToast(result);
        finish();
    }
}
AndroidManifest添加配置

很easy,只需要添加如下:

    <!-- 微信支付 -->
    <activity
        android:name=".wxapi.WXPayEntryActivity"
        android:exported="true"
        android:launchMode="singleTop" />
新增对应解析实体类

import com.google.gson.annotations.SerializedName;

/**
 * author : HLQ
 * e-mail : 925954424@qq.com
 * time   : 2018/02/06
 * desc   : 微信支付返回结果实体类
 * version: 1.0
 */
public class WXPayResultBean {

    private String appid;
    private String noncestr;
    @SerializedName("package")
    private String packageX;
    private String partnerid;
    private String prepayid;
    private String sign;
    private String timestamp;

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getNoncestr() {
        return noncestr;
    }

    public void setNoncestr(String noncestr) {
        this.noncestr = noncestr;
    }

    public String getPackageX() {
        return packageX;
    }

    public void setPackageX(String packageX) {
        this.packageX = packageX;
    }

    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 getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }
}
在正式下单前需要判断微信是否被安装

相对比微信,支付宝这一点做得很人性化,无论是从接入或者是后期使用,即使用户没有安装支付宝,同样可以通过H5进行支付。

在这里LZ猜想,估计微信团队想着,现在人手必备微信,很少出现这种情况,毕竟社交支付宝有所欠缺吧。

So,我们需要如下兼容下:

    /**
     * 大部分手机可以直接通过isWXAppInstalled isWXAppSupportAPI判断
     * 但是还是有一些奇葩机型 在此做个兼容
     *
     * @return
     */
    private boolean getIsInstallWX() {
        if (mIWXApi.isWXAppInstalled() && mIWXApi.isWXAppSupportAPI()) {
            return true;
        } else {
            final PackageManager packageManager = selfActivity.getPackageManager();// 获取packagemanager
            List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
            if (pinfo != null) {
                for (int i = 0; i < pinfo.size(); i++) {
                    String pn = pinfo.get(i).packageName;
                    if (pn.equalsIgnoreCase("com.tencent.mm")) {
                        return true;
                    }
                }
            }
            return false;
        }
    }
正式调用微信下单

首先来看下官方给出正式下单所需要的参数:

这里写图片描述

而在小主所对应的Activity中,只需要如下操作即可:

    private void getWXPay(final WXPayResultBean wxPayResultBean) {
        mIWXApi = WXAPIFactory.createWXAPI(this, null);
        mIWXApi.registerApp(wxPayResultBean.getAppid());
        if (getIsInstallWX()) {
            Runnable payRunnable = new Runnable() {
                @Override
                public void run() {
                    PayReq request = new PayReq();
                    request.appId = wxPayResultBean.getAppid();
                    request.partnerId = wxPayResultBean.getPartnerid();
                    request.prepayId = wxPayResultBean.getPrepayid();
                    request.packageValue = wxPayResultBean.getPackageX();
                    request.nonceStr = wxPayResultBean.getNoncestr();
                    request.timeStamp = wxPayResultBean.getTimestamp() + "";
                    request.sign = wxPayResultBean.getSign();
                    mIWXApi.sendReq(request);
                }
            };
            Thread payThread = new Thread(payRunnable);
            payThread.start();
        } else {
            UIHelper.getSystemHintToast("请安装微信客户端后使用微信支付,谢谢合作~");
            return;
        }
    }

2018年2月9日09:23:26更新:

这里需要注意的是需要判断是否本地安装了微信,如果没安装,则用户选择微信支付后,界面无反应,所以这里我们判断如果没有安装直接提示用户:请安装微信后进行支付等。

就这么So easy~~~ 微信支付搞定~~~

支付宝快速集成(可能都用不了1分钟)

相对于微信支付,支付宝支付可谓是良心之作,集成简单,方便快捷~

首先,来关注一波文档:

1. 快速接入文档
2. SDK下载

下载SDK,添加Lib

将下载好的压缩包解压,拷贝jar包到项目中,添加即可:

这里写图片描述

添加权限声明

仔细核对~~~

<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" />
AndroidManifest添加配置
    <!-- 支付宝 -->
    <activity
        android:name="com.alipay.sdk.app.H5PayActivity"
        android:configChanges="orientation|keyboardHidden|navigation|screenSize"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden" >
    </activity>
    <activity
        android:name="com.alipay.sdk.app.H5AuthActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:screenOrientation="behind"
        android:windowSoftInputMode="adjustResize|stateHidden" >
    </activity>
添加解析实体类

import android.text.TextUtils;

import java.util.Map;

public class PayResultBean {

    private String resultStatus;
    private String result;
    private String memo;

    public PayResultBean(Map<String, String> rawResult) {
        if (rawResult == null) {
            return;
        }
        for (String key : rawResult.keySet()) {
            if (TextUtils.equals(key, "resultStatus")) {
                resultStatus = rawResult.get(key);
            } else if (TextUtils.equals(key, "result")) {
                result = rawResult.get(key);
            } else if (TextUtils.equals(key, "memo")) {
                memo = rawResult.get(key);
            }
        }
    }

    @Override
    public String toString() {
        return "resultStatus={" + resultStatus + "};memo={" + memo
                + "};result={" + result + "}";
    }

    /**
     * @return the resultStatus
     */
    public String getResultStatus() {
        return resultStatus;
    }

    /**
     * @return the memo
     */
    public String getMemo() {
        return memo;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }
}
调起支付宝支付
    private void getAliPay(final String payInfo) {
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(selfActivity);
                Map<String, String> result = alipay.payV2(payInfo, false);
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResultBean payResult = new PayResultBean((Map<String, String>) msg.obj);
                    /**
                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult(); // 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        Toast.makeText(selfActivity, "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        Toast.makeText(selfActivity, "支付失败", Toast.LENGTH_SHORT).show();
                    }
                    break;
                }
                default:
                    break;
            }
            return false;
        }
    });

Ok,集成完毕~

The End

到此,微信以及支付宝支付,集成完毕~

如果后续如有其他问题,LZ及时更新~~~

当然欢迎各位看官提出更好的方案~~~

Thanks 查阅~~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HLQ_Struggle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值