支付宝、微信支付功能封装

支付宝
2016/11/23支付宝全面升级,记录一下支付宝支付的开发步骤:
第一步:创建应用并获取APPID(和开发没什么关系,这里不介绍,可以参考:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1
第二步:配置密钥
开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)
注:具体配置可以参考支付宝官方文档,地址:https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105310&docType=1
第三步:集成并配置SDK
下载支付宝sdk,导入jar包
这里写图片描述
修改Manifest

<activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" >
</activity>
<activity
            android:name="com.alipay.sdk.auth.AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" >
 </activity>

添加权限

<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" />

添加混淆

-libraryjars libs/alipaySDK-20150602.jar

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}

第四步:调用接口
先附上支付宝的支付流程图:
这里写图片描述
看似好多的步骤,其实前台只需要三部即可

  1. 调起支付宝并传入支付参数;
  2. 输入支付密码;
  3. 等待支付结果,跳转;
    调起支付
public void pay(final String orderInfo) {
        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                PayTask alipay = new PayTask(activity);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Logger.i("msg:" + result.toString());

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

支付宝在文档中用红色的字体告诉我们:orderStr的获取必须来源于服务端(也就是我们代码中的orderInfo);
只需要这一步我们就可以调用支付宝支付了,接下来我们要做的就是等待用户操作完之后支付宝给我们回调

 @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        ToastUtils.showShortToast("支付成功");
                        RxBus.getInstance().post(new RxEvent(Constant.ALIPAY_PAY_SUCCESS));
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        ToastUtils.showShortToast("支付失败");
                        RxBus.getInstance().post(new RxEvent(Constant.ALIPAY_PAY_FAIL));
                    }
                    break;
                }
                default:
                    break;
            }
        }
    };

PayResult 这个类可以在支付宝demo中找到。
全部代码:

public class AliPayUtils {

    private Activity activity;
    private static AliPayUtils instance;

    private static final int SDK_PAY_FLAG = 1;

    private AliPayUtils(Activity activity) {
        this.activity = activity;
    }

    public static AliPayUtils getInstance(Activity activity) {
        if (instance == null) {
            instance = new AliPayUtils(activity);
        }
        return instance;
    }

    /**
     * 支付接口
     */
    public void pay(final String orderInfo) {
        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                PayTask alipay = new PayTask(activity);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Logger.i("msg:" + result.toString());

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }


    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        ToastUtils.showShortToast("支付成功");
                        RxBus.getInstance().post(new RxEvent(Constant.ALIPAY_PAY_SUCCESS));
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        ToastUtils.showShortToast("支付失败");
                        RxBus.getInstance().post(new RxEvent(Constant.ALIPAY_PAY_FAIL));
                    }
                    break;
                }
                default:
                    break;
            }
        }
    };

}

在我们调用的时候只需要

  AliPayUtils.getInstance(this).pay(orderInfo);

再次强调为了安全,orderInfo必须由服务器生成。



微信支付
微信支付相对于支付宝支付文档内容很少,网上也有好多博客在记录怎么样填坑。这里记录一下微信开发:
1、后台设置(这里不介绍,可以参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
2、注册APPID
先添加微信jar包
这里写图片描述
注册appid

  IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
        msgApi.registerApp(Constant.WX_APP_ID);

注册后需要检查是否安装了微信客户端:

  if (!msgApi.isWXAppInstalled()) {
            ToastUtils.showShortToast("没有安装微信,请安装后再试");
            return;
        }
        if (!msgApi.isWXAppSupportAPI()) {
            ToastUtils.showShortToast("当前版本不支持支付功能");
            return;
        }

3调起微信支付(支付参数由服务器生成)

 msgApi.sendReq(req);

4、支付结果回调
微信支付回调必须在 net.sourceforge.simcpux.wxapi包下的WXPayEntryActivity类中。可以直接拷贝微信Demo中的WXPayEntryActivity。
在onRest函数中接收回调参数

 @Override
    public void onResp(BaseResp resp) {
        switch (resp.errCode) {
            case 0:
                ToastUtils.showShortToast("支付成功");
                RxBus.getInstance().post(new RxEvent(Constant.WXPAY_PAY_SUCCESS));
                break;
            case -1:
                ToastUtils.showShortToast("支付失败");
                RxBus.getInstance().post(new RxEvent(Constant.WXPAY_PAY_FAIL));
                break;
            case -2:
                ToastUtils.showShortToast("取消支付");
                RxBus.getInstance().post(new RxEvent(Constant.WXPAY_PAY_CANCEL));
                break;
            default:
                break;
        }
    }

完整代码:

public class WXPayUtils {

    private static WXPayUtils instance;

    private WXPayUtils() {
    }

    public static WXPayUtils getInstance() {
        if (instance == null) {
            instance = new WXPayUtils();
        }
        return instance;
    }


    public void pay(Context context, PayReq req) {
        IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
        msgApi.registerApp(Constant.WX_APP_ID);
        if (!msgApi.isWXAppInstalled()) {
            ToastUtils.showShortToast("没有安装微信,请安装后再试");
            return;
        }
        if (!msgApi.isWXAppSupportAPI()) {
            ToastUtils.showShortToast("当前版本不支持支付功能");
            return;
        }
        msgApi.sendReq(req);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值