Android支付(支付宝,微信,银联)集成使用

来源:互联网 发布:摄像机ntp端口号 编辑:程序博客网 时间:2024/05/18 00:15

关于Android支付(支付宝,微信,银联),在做过的项目中都有涉及过,无非就是按照其官方开发文档来写,但是不乏有许多坑的地方。这里趁着闲暇时间来写出来,如果有些的不正确的地方请大家及时提出来,谢谢!(这里只是简单的集成和使用,具体的按需求来)

一,支付宝
先看交互流程(重要
这里写图片描述
1.准备
①创建应用(生成APPID),登录https://openhome.alipay.com/platform/appManage.htm

这里写图片描述

这里写图片描述

最后上传应用图标,填写回调接口地址和设置公钥后提交审核即可,审核通过后就会如第一张图所示。

②生成公钥和私钥

这里写图片描述

生成公钥和私钥,请查看https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1

当生成后,公钥和私钥(请勿丢失)会在以下图中的目录中

这里写图片描述

2.集成
①导入jar包,这里可以到https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1下载,然后导入即可

3,使用
① 在AndroidManifest.xml配置
1》权限

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

2》Activity

 <!--Alipay  begin-->        <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>        <!--Alipay  end-->

②复制需要的文件,可以参考官方Demo

这里写图片描述

这里我将开发所需的APPID和私钥为方便写在了本地,这里不推荐,不太安全。

这里写图片描述

4,调用
调用方法

 AlipayApi.AliPay(this,mHandler, "这里传入商户后台返回的订单信息");  //注意:后台返回的订单信息是根据一定的格式拼接的
public class AlipayApi {    public static final int SDK_PAY_FLAG = 1;    public static final int SDK_AUTH_FLAG = 2;    public static void AliPay(final Activity mContext, final Handler mHandler, final String orderInfos) {        if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) {            new AlertDialog.Builder(mContext).setTitle("警告").setMessage("需要配置APPID | RSA_PRIVATE")                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialoginterface, int i) {                            mContext.finish();                        }                    }).show();            return;        }        boolean rsa2 = (RSA2_PRIVATE.length() > 0);        Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);        String orderParam = OrderInfoUtil2_0.buildOrderParam(params);        String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;        String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);        final String orderInfo = orderParam + "&" + sign;        Runnable payRunnable = new Runnable() {            @Override            public void run() {                PayTask alipay = new PayTask(mContext);                Map<String, String> result = alipay.payV2(orderInfo, true);                Log.i("msp", 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 AlipayApi.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")) {                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。                        Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();   //支付成功操作                    } else {                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。                        Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();   //支付失败操作                    }                    break;                }                case AlipayApi.SDK_AUTH_FLAG: {                    @SuppressWarnings("unchecked")                    AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);                    String resultStatus = authResult.getResultStatus();                    // 判断resultStatus 为“9000”且result_code                    // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档                    if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {                        // 获取alipay_open_id,调支付时作为参数extern_token 的value                        // 传入,则支付账户为该授权账户                        Toast.makeText(MainActivity.this,                                "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)                                .show();                    } else {                        // 其他状态值则为授权失败                        Toast.makeText(MainActivity.this,                                "授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();                    }                    break;                }                default:                    break;            }        };    };

注:关于订单信息这块,可以是商户后台按照一定的格式传入,也可以是Android开发者按照官方文档来进行拼接,具体的就不在描述。

最后集成和使用完成。

二,微信
更新中……

三,银联
银联支付请查看该地址:http://www.devstore.cn/evaluation/testInfo/98-133.html

0 0
原创粉丝点击