欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-22 11:11:16
...

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

一,支付宝
先看交互流程(重要
Android支付(支付宝,微信,银联)集成使用
1.准备
①创建应用(生成APPID),登录https://openhome.alipay.com/platform/appManage.htm

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

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

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

②生成公钥和私钥

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

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

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

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

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

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

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

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

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