前言:

在集成支付宝支付的时候遇到一点小麻烦,先在此记录供大家参考

1.授权

支付宝第三方登录需要在后台进行授权,在查看授权的时候我们一定要看清楚时候真的已经获得了权限(我在没有获取权限的情况下集成的效果是提示系统繁忙),进入支付宝开放平台的后台管理中心,点击应用,


未签约的需要填写一些信息。

2,代码集成

其实相对于微信而言,支付宝的代码集成一般都是比较简单的。下载其官网的demo。
点击进入demo页面
然后我们重点来看下PayDemoActivity这里类的相关方法:

/***  重要说明:*  *  这里只是为了方便直接向商户展示支付宝的整个支付流程;所以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 = "";/** 商户私钥,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);}/*** 支付宝支付业务* * @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() {@Overridepublic 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() {@Overridepublic 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是测试的网站,在app内部打开页面是基于webview打开的,demo中的webview是H5PayDemoActivity,* demo中拦截url进行支付的逻辑是在H5PayDemoActivity中shouldOverrideUrlLoading方法实现,* 商户可以根据自己的需求来实现*/String url = "http://m.taobao.com";// url可以是一号店或者淘宝等第三方的购物wap站点,在该网站的支付过程中,支付宝sdk完成拦截支付extras.putString("url", url);intent.putExtras(extras);startActivity(intent);}}

这个demo里有支付和授权两个功能介绍,我们可以重点看其授权代码:

        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;

简单理解为:拼接authinfo,其实这应该是服务器端拼接返回给我们客户端,但是我们不妨来看看这其中需要的参数:

PID:

支付宝支付业务参数,这个东西不好找,具体为:“首页”-》“右上角个人中心”-》“左边mapi网关产品秘钥”可查看。

APPID:

应用的appid。

TARGET_ID:

不重复的一个数即可,可用时间戳。

rsa2:

推荐用RSA加密参数,此时rsa2=true;

RSA2_PRIVATE:

商户私钥。私钥需要通过官方提供的工具生成。
点击查看,下载对应版本的工具后,点击生成的2048位参数就是私钥,同时记得需要将该私钥的文件上传到支付宝开放平台的开发者中心的具体应用中,这样才能生效。

Runnable authRunnable = new Runnable() {@Overridepublic 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();

在runnable中直接调用支付宝的sdk方法authV2即可。然后在handle中进行回调即可,不懂的同学可以文章下方留言。
同时也可参考下集成支付宝支付。

最近搞了个Android技术分享的公众号,欢迎关注投稿。

Android 集成支付宝第三方登录相关推荐

  1. Android集成Facebook第三方登录,全流程

    首次接触海外项目,开发环节与测试流程刚开始搞得一头雾水,历时两周终于把登录和支付调通了,特此记录下: 不过总结下来,与国内流程不同的点,主要是测试流程,需要专门的测试账号与测试权限才能测通 首先打开开 ...

  2. 友盟社会化Android组件之第三方登录

    前段时间公司需要,逐步了新浪微博.腾讯qq.微信等授权登录验证的问题.如果要一个个申请,看文档写代码也是很多流程的.干脆用友盟社会化Android组件之第三方登录.友盟是集成了这些平台,还有其他主流的 ...

  3. SpringBoot项目接入支付宝第三方登录

    今年大四毕业,由于新冠肺炎疫情的原因,开学和毕业答辩的时间都进行了推迟,因此有较多的时间对毕设项目做修改和调整,便在项目中接入微信和支付宝的第三方登录.在此需要说明,微信和支付宝的开发者平台大体一致, ...

  4. 最详细Java实现支付宝第三方登录

    文章目录 概要 流程 代码 小结 概要 分享最新Java实现支付宝登录.(注:支付宝登入用个人账号登录(不非得用企业账号)即可测试,如果用沙箱环境进行测试可能会有Bug,建议用个人用户进行测试❤)如果 ...

  5. Android集成ShareSDK第三方分享和登录

    本篇记录在Android平台上如何集成ShareSDK实现第三方登陆和分享,以及其中可能会遇到的坑. Mob官网 下载 如图选择你需要分享的平台: 集成 解压下载的文件,然后在ShareSDK for ...

  6. 踩坑!android端集成QQ第三方登录

    有时候在想,自己怎么能这么懒,几篇早就想写的博客,一直拖到一两个月后才着手开始写,说实话都有点忘记了,但还是记录一下吧,兴许以后用的到呢~ 回归正题,这次来记录一下我集成QQ三方登录的过程吧(Ps:a ...

  7. android如何实现支付宝,(Android集成支付宝支付)react-native实现支付宝支付

    网上关于RN的支付宝支付组件大部分都是IOS的,Android要实现支付宝支付只剩下走原生这一步了. 整体思路: 1.在蚂蚁金服开放平台申请应用 2.在android原生集成支付宝 3.封装andro ...

  8. Android友盟第三方登录

    最近项目中使用到了友盟(社会化Android组件),开始集成的时候没来及细读友盟提供的开发文档.现在来总结一下集成过程中遇到的问题. ##### 1.申请第三方账号     友盟   新浪微博开放平台 ...

  9. Android应用接入第三方登录之新浪登录

    众所周知,移动互联网在这几年经历了蓬勃发展,到目前为止,移动互联网发展仍然很强劲.其中移动设备系统以android占据主导地位,之前是加拿大的黑莓系统占据主导,但后来随着android系统的问世,黑莓 ...

  10. Android 钉钉第三方登录问题

    使用钉钉第三方登录 第一步 去钉钉开发者平台注册App 钉钉开发者平台地址 注册自己的应用 *获取到自己的AppId 和 AppKey 钉钉开发者文档 实现步骤 1.注入依赖 implementati ...

最新文章

  1. 杀死linux-zombie僵尸进程
  2. pycharm全局修改
  3. MSDN、RTM、OEM、VOL四大版本之区别
  4. 七夕用腾讯最热门五大编程语言写三行情书
  5. Windows应用程序启动命令汇总
  6. MMKV集成与原理,轻松拿下offer
  7. http抓包神器:Charles for Mac 特别版v4.6
  8. c语言实现路由功能,前端路由的两种实现方式,内附详细代码
  9. httpclient之get/post
  10. 安装Office2016卸载WPS后office图标异常解决办法
  11. 系统测试包含的全部内容(建议收藏)
  12. 图片识别出处_搜图神器!你还在问图片的出处吗?
  13. 鸿蒙智慧电视,鸿蒙带来的超强多屏互动 荣耀智慧屏与普通电视的不同
  14. Ayla艾拉物联基于AWS构建IoT艾拉云
  15. Unity打包生成APK文件提交应用宝踩坑记录
  16. 蓝桥杯 Beaver's Calculator
  17. 浏览器指纹技术与浏览器指纹破解办法
  18. 数学基础 - 线性空间(Vector Space)
  19. 一篇文章带你更好了解热门Java开发工具IDEA!
  20. 第三方软件测试 CNAS软件测试报告

热门文章

  1. 医宗金鉴自学指南_自学中医看什么书
  2. 云计算就业前景究竟好不好 零基础如何学云计算
  3. html从谷歌浏览器跳转到IE,IE浏览器和谷歌浏览器相互跳转
  4. 《高效能人士的七个习惯》读后感
  5. 企业短信平台发展趋势和展望——SUBMAIL赛邮
  6. 推荐10个堪称神器的学习网站
  7. 千古第一文人苏轼的众CP
  8. python求列表的方差值
  9. C语言实现英文句子单词提取并分离
  10. python背离点的判断