我的Android成长之路——支付宝的沙箱测试
第一次写博客,简单写一下支付宝的沙箱测试
下图为支付宝官方demo中的PayDemoActivity,做沙箱调试时,你需要登录你的支付宝,进去开发中心获取支付宝提供给你的沙箱测试专用买家和卖家信息,就是下文中需要你自己填写的APPID和PID。
当然你也需要去官网下载商家公钥私钥生成器,很简单的。生成私钥成功后填写入RSA2_PRIVATE这个参数即可。
最后的最后,你需要下载一个沙箱支付宝到你的测试上,再在你的demo中onCreate()方法中添加一句
“EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); ”确保你可以方便的调用沙箱支付宝的接口来实现预期功能。
以上,完成。
import java.util.Map;import com.alipay.sdk.app.AuthTask; import com.alipay.sdk.app.EnvUtils; import com.alipay.sdk.app.PayTask; import com.alipay.sdk.pay.demo.util.OrderInfoUtil2_0;import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentActivity; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Toast;/*** 重要说明:* * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;* 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;* 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险; */ public class PayDemoActivity extends FragmentActivity {/** 支付宝支付业务:入参app_id */public static final String APPID = "";//填我填我/** 支付宝账户登录授权业务:入参pid值 */public static final String PID = "";//填我填我 /** 支付宝账户登录授权业务:入参target_id值 */public static final String TARGET_ID = "1djcf";/** 商户私钥,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 = "";private static final int SDK_PAY_FLAG = 1;private static final int SDK_AUTH_FLAG = 2;@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;}case 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(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;}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.pay_main);
/*沙箱调试必备
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); } /** * 支付宝支付业务 * * @param v */ public void payV2(View v) { if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) { new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置APPID | RSA_PRIVATE") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { //finish(); } }).show(); return; } /** * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以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; 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(); } /** * 支付宝账户授权业务 * * @param v */ public void authV2(View v) { if (TextUtils.isEmpty(PID) || TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE)) || TextUtils.isEmpty(TARGET_ID)) { new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER |APP_ID| RSA_PRIVATE| TARGET_ID") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { } }).show(); return; } /** * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成; * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成; * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险; * * authInfo的获取必须来自服务端; */ boolean rsa2 = (RSA2_PRIVATE.length() > 0); Map<String, String> authInfoMap = OrderInfoUtil2_0.buildAuthInfoMap(PID, APPID, TARGET_ID, rsa2); String info = OrderInfoUtil2_0.buildOrderParam(authInfoMap); String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE; String sign = OrderInfoUtil2_0.getSign(authInfoMap, privateKey, rsa2); final String authInfo = info + "&" + sign; Runnable authRunnable = new Runnable() { @Override public void run() { // 构造AuthTask 对象 AuthTask authTask = new AuthTask(PayDemoActivity.this); // 调用授权接口,获取授权结果 Map<String, String> 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(); } /** * 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(); } /** * 原生的H5(手机网页版支付切natvie支付) 【对应页面网页支付按钮】 * * @param v */ public void h5Pay(View v) { Intent intent = new Intent(this, H5PayDemoActivity.class); Bundle extras = new Bundle(); /** * url 是要测试的网站,在 Demo App 中会使用 H5PayDemoActivity 内的 WebView 打开。 * * 可以填写任一支持支付宝支付的网站(如淘宝或一号店),在网站中下订单并唤起支付宝; * 或者直接填写由支付宝文档提供的“网站 Demo”生成的订单地址 * (如 https://mclient.alipay.com/h5Continue.htm?h5_route_token=303ff0894cd4dccf591b089761dexxxx) * 进行测试。 * * H5PayDemoActivity 中的 MyWebViewClient.shouldOverrideUrlLoading() 实现了拦截 URL 唤起支付宝, * 可以参考它实现自定义的 URL 拦截逻辑。 */ String url = "http://m.taobao.com"; extras.putString("url", url); intent.putExtras(extras); startActivity(intent); }}
我的Android成长之路——支付宝的沙箱测试相关推荐
- 一个大神的Android成长之路
这篇文章是我的一个朋友写的,总结了这些年的技术成长之路,我觉得对于很多技术人都有借鉴的作用,技术是相通的,不要整天想一口气吃成一个胖子,不积跬步无以至千里,既然选择了技术这条路,就不畏艰辛,苦中有甜, ...
- 王小二C:一个大神的Android成长之路
这篇文章是我的一个朋友写的,总结了这些年的技术成长之路,我觉得对于很多技术人都有借鉴的作用,技术是相通的,不要整天想一口气吃成一个胖子,不积跬步无以至千里,既然选择了技术这条路,就不畏艰辛,苦中有甜, ...
- 游戏测试成长之路01-初识游戏测试
前情简介:游戏测试成长之路这个主题将结合自身经历和经验,介绍和分享游戏测试的相关软硬件技能,希望能帮助更多选择这个从业方向的小伙伴少走弯路,快速成长.(游戏测试本身没有系统化的标准和定义,网上也缺少相 ...
- Vue node.js实现支付宝支付(沙箱测试)
一.支付宝开放平台创建应用:打开支付宝开放平台首页(注意:正式环境.沙箱环境都需要此步) 1.选择开发者中心 ---> 网页&移动应用 (此时是实现网站支付功能) 2.选择支付接入 3. ...
- Android成长之路-实现简单动画
实现简单动画: 在drawable目录中放入图片, 并且创建xml文件 frame.xml 存入图片,如下: [java] view plaincopy <pre class="htm ...
- Android成长之路-音乐播放器的实现
strings.xml <?xml version="1.0" encoding="utf-8"?> <resources><st ...
- 我的Android成长之路(9)----黑科技dataBinding(二)
昨天我们一起学习了dataBinding的基础用法,我想你可能还停留在它只是不用再findViewById,其实不然,今天我们就来扩展延伸,看看这个框架到底有什么魔力让谷歌官方大力推崇.这里还没看昨天 ...
- 我的Android成长之路(1)----TextView设置不同大小字体
TextView tv = (TextView) findViewById(R.id.main_text); Spannable sp = new SpannableString("字体大小 ...
- 支付宝配置沙箱测试android,个人开发者使用支付宝沙箱环境进行代码调试
因为支付宝支付接口只有企业身份才能申请,但是由于种种原因个人开发者没有企业资质无法申请到支付接口权限,这也是很多开发者遇到的问题.在之前推出了支付宝支付接口开发系列课程之后也遇到了很多开发者的反馈:没 ...
最新文章
- mysqldump 导入数据库可能遇到错误
- 日志级别_Feign:请求压缩amp;日志级别【了解】
- django drf Filter
- MetInfo最新版代码审计漏洞合集
- MySQL的事务与事务隔离
- python 异步与io
- SpringBoot2整合Activiti6工作流框架
- 推荐!ICDAR 2019-ArT任意形状文字识别国际竞赛!奖金丰厚
- 如何从一个吊丝男成为一个合格的高级程序员
- springcloud之Feign、ribbon设置超时时间和重试机制的总结
- D-star Lite算法及其动态路径规划实验研究
- cat6 万兆_专业扫盲Cat5e/Cat6/Cat6a/Cat7网线系列
- 68个Python内置函数详解,进阶必备!
- ubuntu系统安装完显卡驱动出现黑屏和登录死循环的解决方法(新增惠普暗夜精灵7-3070显卡解决方法)
- 安装pillow遇到的问题
- 计算机常见故障原因有哪些,电脑常见故障原因及解决方法
- 使用python实现简单网页图片抓取
- 未来的计算机范文,未来的电脑作文(通用3篇)
- 全国计算机技术与软件专业技术资格(水平)考试2019年上半年考试公告(湖北省)
- hdoj 5651 xiaoxin juju needs help 【组合数学】
热门文章
- 帝国cmssitemap.php,帝国CMS如何自动生成sitemap.xml网站地图
- 子网划分例题-等长划分、不等长划分
- dede php语句调用,dede织梦在{dede:php}中调用文章id或aid
- DEI脉冲发生器维修DEI脉冲电源维修PVX-4130
- elasticsearch和head 配置x-pack访问登录控制
- matlab怎么匹配特征参数,sift特征匹配matlab
- Java安全—CommonsCollections7
- 基础排序算法及其优化(Java)
- Scoop 包管理工具安装及常用命令
- 设计模式--第七章 克隆模式