参考官方文档https://opendocs.alipay.com/mini/introduce/pay

支付宝小程序的支付和微信小程序的支付一样第一步都是要获取到用户的唯一标识,在微信中我们获取到的是wxopenid,而支付宝中获取到的是userid。

1     使用的alipay-sdk包
2 <dependency>
3 <groupId>com.alipay.sdk</groupId>
4 <artifactId>alipay-sdk-java</artifactId>
5 <version>4.5.0.ALL</version>
6 </dependency>

1.授权 ==》前端使用 my.getAuthCode方法。

 参考官方文档https://opendocs.alipay.com/mini/introduce/authcode

2.根据第一步的授权拿到auth_code来获取唯一标识userid

  

 1     /**
2 * 授权码
3 * @param auth_code
4 * @return
5 * @throws AlipayApiException
6 */
7 @RequestMapping("getInfo")
8 public AjaxJson getInfo(String auth_code) throws AlipayApiException {
9 //使用支付宝小程序的固定方法获取auth_code
10 if(auth_code==null||auth_code.length()==0) {
11 return AjaxJson.getError("请求参数auth_code不能为空");
12 }else {
13 //String serverUrl, String appId, String privateKey, String format,String charset, String alipayPublicKey, String signType
14 //实例化客户端 参数:正式环境URL,Appid,商户私钥 PKCS8格式,字符编码格式,字符格式,支付宝公钥,签名方式
15 AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",AliPayConfig.APP_ID,AliPayConfig.MERCHANT_PRIVATE_KEY,"json","GBK",AliPayConfig.ALIPAY_PUBLIC_KEY,"RSA2");
16 AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
17 // 值为authorization_code时,代表用code换取
18 request.setGrantType("authorization_code");
19 //授权码,用户对应用授权后得到的
20 request.setCode(auth_code);
21 //这里使用execute方法
22 AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
23 //刷新令牌,上次换取访问令牌时得到。见出参的refresh_token字段
24 request.setRefreshToken(response.getAccessToken());
25 //返回成功时 就将唯一标识返回
26 if(response.isSuccess()){
27 System.out.println("调用成功");
28 //我这里只返回了一个字段给前端用
29 Map<String,Object> map=new HashMap<>();
30 map.put("userid", response.getUserId());
31 return AjaxJson.getSuccessData(map);
32 } else {
33 return AjaxJson.getError("调用失败");
34 }
35 }
36 }

3.获取用户信息 使用API中的方法 my.getOpenUserInfo 。

注意:获取会员基础信息需要在开放平台小程序 管理页面 申请添加 获取会员基础信息 功能包。

这里肯定会有盆友不解授权和获取用户信息可以写在一个方法里而我写了两个方法,对的。我一开始是放在一起写的,但是测试的时候一直报出Isv权限不足,能解决的办法都试过了,继续报错。所以我是分开写了方法。

4.支付 官方文档https://opendocs.alipay.com/mini/introduce/pay

注意这里是官方文档中的代码

以下是我本人的代码

    /**
* 用户唯一标识id
* @param userid
* @return
*/
@RequestMapping("/pay1")
public static AlipayTradeCreateResponse pay(String userid){
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.MERCHANT_PRIVATE_KEY, "json", AliPayConfig.CHARSET, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
//设置请求参数
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); JSONObject json=new JSONObject();
//雪花算法订单号
IdWorker idworker=new IdWorker();
Long oid=idworker.nextId();
String out_trade_no =String.valueOf(oid);
//订单号
json.put("out_trade_no",out_trade_no);
//金额 这里的金额是以元为单位的可以不转换但必须是字符串
json.put("total_amount","0.01");
//描述
json.put("subject","测试");
//用户唯一标识id 这里必须使用buyer_id 参考文档
json.put("buyer_id",userid);
//对象转化为json字符串
String jsonStr=json.toString();
//商户通过该接口进行交易的创建下单
request.setBizContent(jsonStr);
//回调地址 是能够访问到的域名加上方法名
request.setNotifyUrl("http://vvvvvvv.cn/aliPay/notifyUrl");
try {
//使用的是execute
AlipayTradeCreateResponse response = alipayClient.execute(request);
return response;
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}

我在这里有一些代码没有使用官方文档的方式写参数,是因为我一开始写的时候去测试时一直返回参数无效,而我找了好久也不知道是什么原因,这就很尴尬了,所以我换了一种方式。大家写到这个地方的话可以参考。

前端调用my.tradePay方法

注意这里的trandeNo参数不用改,这是固定的,订单号需要你自己去支付那里获取。切记:获取到的值是trade_no,并不是outTradeNo。

这是本人调试时的图,接下来离成功就不远了。

5.回调方法

 1      /**
2 * 支付宝服务器异步通知url
3 * @throws Exception
4 */
5 @RequestMapping(value="/notifyUrl")
6 public void notifyUrl(HttpServletRequest request,HttpServletResponse response) throws Exception{
7 //获取支付宝发送过来的信息
8 Map<String,String> params = new HashMap<String,String>();
9 Map<String,String[]> requestParams = request.getParameterMap();
10 //循环获取到所有的值
11 for(String str:requestParams.keySet()) {
12 String name =str;
13 String[] values = (String[]) requestParams.get(name);
14 String valueStr = "";
15 for (int i = 0; i < values.length; i++) {
16 valueStr = (i == values.length - 1) ? valueStr + values[i]
17 : valueStr + values[i] + ",";
18 }
19 //乱码解决,这段代码在出现乱码时使用
20 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
21 params.put(name, valueStr);
22 }
23 //调用SDK验证签名
24 boolean signVerified = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
25 //boolean类型signVerified为true时 则验证成功
26 if(signVerified) {
27 //获取到支付的状态 TRADE_SUCCESS则支付成功
28 String trade_status =request.getParameter("trade_status");
29 if (trade_status.equals("TRADE_SUCCESS")){
30 System.out.println("支付成功");
31 }else {
32 System.out.println("支付失败");
33 }
34 }
35 //签名验证失败
36 else {
37 System.out.println(AlipaySignature.getSignCheckContentV1(params));
38 }
39 }

Java springboot支付宝小程序授权,获取用户信息,支付及回调的更多相关文章

  1. 微信小程序授权获取用户详细信息openid

    小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that. ...

  2. 微信 公众号 小程序 授权 unionid 用户信息 实验总结

    -*-*-*-*-*-*-*-*-*--*-*-*-1.小程序通过code获取用户openid的接口,如果用户曾经授权并未过期,或者用户关注过同主体的公众号,会带回unionID,但没有用户头像等信息 ...

  3. 微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。

    在这里给大家分享下我的心得,1.写代码前一定要对整个流程有个了解.我就是因为在先不了解整个过程中去ctrl+c+v他人的博客代码,花费很多无用的时间去处理还不知道能不能跑的起来的代码. 2.本人比较喜 ...

  4. 【微信小程序】获取用户地理位置权限,二次请求授权,逆解析获取地址

    摘要:微信小程序内获取用户地理位置信息授权,被拒绝后二次获取,获取权限后逆解析得到用户所在省市区等.. 场景:商城类小程序,在首页时需展示附近门店,即用户刚进入小程序时就需要获取到用户位置信息 ste ...

  5. 微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  6. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  7. nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId

    nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId 前言: 我准备用nodejs+koa+uniapp实现一款餐饮点单小程序,以及nodejs+koa+vue实现后端管理 ...

  8. 支付宝小程序serverless---获取用户信息(头像)并保存到云数据库

    支付宝小程序serverless---获取用户信息(头像)并保存到云数据库 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 我又 ...

  9. [重要更新]微信小程序登录、用户信息相关接口调整:使用 wx.getUserProfile 取代 wx.getUserInfo

    2021年2月24日,微信官方团队发布了一个调整通知:<小程序登录.用户信息相关接口调整说明>,公告明确从4月13日起,所有发布的小程序将无法使用 wx.getUserInfo 接口(JS ...

随机推荐

  1. 虚拟IP原理及使用

    一.前言 高可用性 HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性.HA 系统是目前企业防止核心 ...

  2. SA-IS学习笔记

    Q:SA-IS 是什么玩意? A:一种 \(O(n)\) 求后缀数组的高科技. Q:为什么会有 SA-IS 这种算法? A:因为它是 \(O(n)\) 的,比倍增 \(O(n\log n)\) 快. ...

  3. 第一章、Docker 简介

    笔记内容来自:第一本Docker书 [澳] James Turnbull 著 李兆海 刘斌 巨震 ​ Docker 是一个能够把开发的应用程序自动部署到容器的开源引擎.(由Docker 公司,前dot ...

  4. 五、git学习之——分支管理策略、Bug分支、feature分支、多人协作

    一.分支管理策略 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生 ...

  5. PHP文件上传、错误处理

    说明 这篇是针对之前php知识的补充内容 目录 说明 1. PHP目录处理函数 2. PHP文件权限设置 3. PHP文件路径函数 4. PHP实现文件留言本 5.PHP文件上传 1. php文件上传 ...

  6. Azure应用服务+Github实现持续部署

    上次我们介绍了如何使用Azure应用服务(不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序).我们通过Visual studio新建一个项目后手动编译发布代码.然后通过F ...

  7. 除了MD5加密,试一下签名吧

    需求 MD5加密,简单密码用彩虹表很容易破解. 密码不能被暴力破解,可以根据定制字符,时间戳等防止破解 解决方案 签名 密码加密 源码 const crypto = require('crypto') ...

  8. Docker修改默认的网段

    一,问题 docker安装后默认的网段是172.17网段的,和真实环境网段冲突导致本机电脑无法连接docker机器. 二,解决办法 修改docker默认网段 1,先把docker停止 systemct ...

  9. 工作三年!全靠大佬的Java笔记,年底跳槽阿里涨了10K

    前言 不论是校招还是社招都避免不了各种⾯试.笔试,如何去准备这些东⻄就显得格外重要,之前8月底阿里的人事部门打电话叫我要不要面试,当时正处于换工作的期间,于是就把简历发给阿里hr,人事审核后经过一些列 ...

  10. [日常摸鱼][POI2000]病毒-Tire图(AC自动机)+dfs

    https://www.luogu.org/problemnew/show/P2444 (没有bzoj权限号T_T) 字符串题对我这种傻逼来说真是太难了x 题意:输入$n$个01组成的模式串串,判断是 ...