利用沙箱测试调用支付宝
今天我们来介绍下如何利用沙箱测试调用支付宝
首先登陆蚂蚁金服官网:https://docs.open.alipay.com
登陆的账号是用自己的支付宝账号,然后在首页导航栏找到开发接入,然后在下面找到沙箱
点击进去,他会自动帮你生成沙箱账号,里面包括一个买家账号和一个买家账号
sha.png
然后点击沙箱应用,他已经帮我自动生成appID,我们需要做的就是生成Rsa2
sha2.png
生成公钥和私钥的具体的步骤 https://docs.open.alipay.com/291/105971
记住私钥后面会用到。
下载支付宝客户端,并用买家账号登陆
sha3.png
下载官方demo,并导入到Androidstdio。
下载地址:https://docs.open.alipay.com/54/104509
然后我们需要在PayDemoActivity.class添加配置信息
步骤一
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_main);
//添加下面这行代码,表示启用沙箱环境
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
}
步骤二
/** 支付宝支付业务:入参app_id */
public static final String APPID = "沙箱应用的appId";
/** 支付宝账户登录授权业务:入参pid值 */
public static final String PID = "商家账号的UID";
/** 支付宝账户登录授权业务:入参target_id值 */
public static final String TARGET_ID = "";
/** 商户私钥,pkcs8格式 */
/** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 */
/** 如果商户两个都设置了,优先使用 RSA2_PRIVATE */
/** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE */
/** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, */
/** 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1 */
public static final String RSA2_PRIVATE = "私钥";
public static final String RSA_PRIVATE = "";
注:TARGET_ID还不知道如何获得,官网给出的解释
https://tech.open.alipay.com/support/knowledge/index.htm?categoryId=24153&knowledgeId=201602074386&scrollcheck=1#/?_k=uizo6i
步骤三
运行程序,运行截图如下:
2.jpg
0.jpg
总结:
调用接口的详细流程图
1.jpg
主要流程
a.向服务器发送请求,服务器返回订单信息
/**
* 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
* 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
* 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
*
* orderInfo的获取必须来自服务端;
*/
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;
b.调用支付宝异步请求发起支付
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(PayDemoActivity.this);
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();
c.处理回调结果
@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")) {
// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 该笔订单真实的支付结果,需要依赖服务端的异步通知。
Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}
break;
}
其实调用支付宝可以实现的功能还是很多的,更多详情就要看支付宝的官方API文档了
网友评论