支付宝支付简介

支付宝支付

具体实现代码如下:

public void requestPay() {

    //请求网络获取预订单authInfo(信息已经过服务器签名,这就要求服务器端也需要集成alipay的sdk才能实现)。。。

        final String authInfo = info + "&" + sign;
            Runnable authRunnable = new Runnable() {
                @Override
                public void run() {
                    // 构造AuthTask 对象
                    AuthTask authTask = new AuthTask(PayDemoActivity.this);
                    // 调用授权接口,获取授权结果
                    Map result = authTask.authV2(authInfo, true);

                    Message msg = new Message();
                    msg.what = SDK_AUTH_FLAG;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                }
            };

            // 必须采用异步调用
            Thread authThread = new Thread(authRunnable);
            authThread.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) msg.obj);
            /**
             对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
             */
            String resultInfo = payResult.getResult();// 同步返回需要验证的信息
            String resultStatus = payResult.getResultStatus();
            // 判断resultStatus 为9000则代表支付成功
            if (TextUtils.equals(resultStatus, "9000")) {
                // 该笔订单是否真实支付成功,需要依赖服务端的异步通知,或直接都使用后台的结果数据
                requestResult();
            } else {
                // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
            }
            break;
        }
        case SDK_AUTH_FLAG: {
            @SuppressWarnings("unchecked")
            AuthResult authResult = new AuthResult((Map) 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(PayDemoActivity.this,
                        "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
                        .show();
            } else {
                // 其他状态值则为授权失败
                Toast.makeText(PayDemoActivity.this,
                        "授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
            }
            break;
        }
        default:
            break;
        }
    };
};

验证:在返回数据resultStatus为9000的情况下,解析result结果:
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
3、校验通知中的seller_id(或seller_email) 是否为out_trade_no这笔单据对应的操作方(有时,一个商户会有多个seller_id/seller_email);
4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明同步校验结果是无效的,否则认定买家付款不成功。
简单做法:完全依赖服务端异步通知,直接调用后台的结果接口;

补充:

/**
 * get the sdk version. 获取SDK版本号(若需要)
 * 
 */
public void getSDKVersion() {
    PayTask payTask = new PayTask(this);
    String version = payTask.getVersion();
    Toast.makeText(this, version, Toast.LENGTH_SHORT).show();
}  

格外提醒:
微信需要配置应用签名:d7a7a6a72b7627be785495b6b842dda8
支付宝需要配置密钥(公钥)
官网地址:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.DJdm6Z&treeId=204&articleId=106079&docType=1

.

你可能感兴趣的:(支付宝支付简介)