Android支付之接入支付宝

版权声明:个人见解,希望可以帮助大家,共同进步. https://blog.csdn.net/weixin_40783315/article/details/83961169

11.11  今天是光棍儿节,也是“剁手”节,所以咱们就来说说这个支付,就说说AS调支付宝吧。

接入支付功能的话个人感觉接入支付宝比接入微信要简单得多。

 接入支付宝的话首先我们要去    蚂蚁金服开放平台   

支付宝进入app支付文档有两种方式,一种是直接在下面的开放业务里

还有一种方法是通过上面的导航栏文档中心,然后滚动到业务接入那一栏,可以看到移动支付 

 其实也可以直接打开         移动支付      可以看一看框框里的东西

 在这里要说明的是个人是不能申请的,只能是企业,所以我demo里面的用的一些资料也是demo里面的

这里是交互流程的链接,想要详细了解的话可以点进去看看。 

运行Demo

我们先来看看官方的demo,链接

选择我们需要的下载解压完直接导入AS并配置一些参数运行就可以查看效果了 

导入jar

将demo里面的alipaySdk-20160223.jar拷贝到我们工程的libs下,并添加到依赖中。

配置

清单文件:

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

activity

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

订单数据生成

这一步,可以在服务端完成,也可以在本地完成

String orderInfo = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01");

/**
 * 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
 */
String sign = sign(orderInfo);
try {
    /**
     * 仅需对sign 做URL编码
     */
    sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

/**
 * 完整的符合支付宝参数规范的订单信息
 */
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

Runnable payRunnable = new Runnable() {

    @Override
    public void run() {
        // 构造PayTask 对象
        PayTask alipay = new PayTask(MainActivity.this);
        // 调用支付接口,获取支付结果
        String result = alipay.pay(payInfo, true);

        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: {
                PayResult payResult = new PayResult((String) msg.obj);
                /**
                 * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
                 * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                 * docType=1) 建议商户依赖异步通知
                 */
                String resultInfo = payResult.getResult();// 同步返回需要验证的信息

                String resultStatus = payResult.getResultStatus();
                // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
                if (TextUtils.equals(resultStatus, "9000")) {
                    Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                } else {
                    // 判断resultStatus 为非"9000"则代表可能支付失败
                    // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
                    if (TextUtils.equals(resultStatus, "8000")) {
                        Toast.makeText(MainActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();

                    } else {
                        // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
                        Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

                    }
                }
                break;
            }
            default:
                break;
        }
    }

};

这里支付成功了,只是提示用户,还得从服务器确认是否正在支付了,我这里只写了本地,其他如果在服务端实现是一样的,你把这代码直接发给后端就行了(如果后端是Java开发),可以看到我们已经成功调起支付宝服务了

测试代码的话GitHub上有好多,官方也有Demo需要的话可以自行去下载

猜你喜欢

转载自blog.csdn.net/weixin_40783315/article/details/83961169