Java springboot支付宝小程序授权,获取用户信息,支付及回调
参考官方文档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支付宝小程序授权,获取用户信息,支付及回调的更多相关文章
- 微信小程序授权获取用户详细信息openid
小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that. ...
- 微信 公众号 小程序 授权 unionid 用户信息 实验总结
-*-*-*-*-*-*-*-*-*--*-*-*-1.小程序通过code获取用户openid的接口,如果用户曾经授权并未过期,或者用户关注过同主体的公众号,会带回unionID,但没有用户头像等信息 ...
- 微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
在这里给大家分享下我的心得,1.写代码前一定要对整个流程有个了解.我就是因为在先不了解整个过程中去ctrl+c+v他人的博客代码,花费很多无用的时间去处理还不知道能不能跑的起来的代码. 2.本人比较喜 ...
- 【微信小程序】获取用户地理位置权限,二次请求授权,逆解析获取地址
摘要:微信小程序内获取用户地理位置信息授权,被拒绝后二次获取,获取权限后逆解析得到用户所在省市区等.. 场景:商城类小程序,在首页时需展示附近门店,即用户刚进入小程序时就需要获取到用户位置信息 ste ...
- 微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId
nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId 前言: 我准备用nodejs+koa+uniapp实现一款餐饮点单小程序,以及nodejs+koa+vue实现后端管理 ...
- 支付宝小程序serverless---获取用户信息(头像)并保存到云数据库
支付宝小程序serverless---获取用户信息(头像)并保存到云数据库 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 我又 ...
- [重要更新]微信小程序登录、用户信息相关接口调整:使用 wx.getUserProfile 取代 wx.getUserInfo
2021年2月24日,微信官方团队发布了一个调整通知:<小程序登录.用户信息相关接口调整说明>,公告明确从4月13日起,所有发布的小程序将无法使用 wx.getUserInfo 接口(JS ...
随机推荐
- 两种方式简单免杀ew
1.资源操作法 使用工具: Restorator 2018 BeCyIconGrabber 首先我们从github下载ew使用360进行查杀 打开Restorator 将ew拖入,右键添加资源 选择图 ...
- 深入解析volatile关键字
前言 很高兴遇见你~ 欢迎阅读我的文章. volatile关键字在Java多线程编程编程中起的作用是很大的,合理使用可以减少很多的线程安全问题.但其实可以发现使用这个关键字的开发者其实很少,包括我自己 ...
- Editor.md解决跨域上传的问题
Editor.md解决跨域上传的问题 编辑 editormd\plugins\image-dialog\image-dialog.js 替换以下代码片段 if (settings.crossDomai ...
- [从源码学设计]蚂蚁金服SOFARegistry之推拉模型
[从源码学设计]蚂蚁金服SOFARegistry之推拉模型 目录 [从源码学设计]蚂蚁金服SOFARegistry之推拉模型 0x00 摘要 0x01 相关概念 1.1 推模型和拉模型 1.1.1 推 ...
- 前端js实现九宫格模式抽奖(多宫格抽奖)
介绍: 前端九宫格是一种常见的抽奖方式,js实现如下,掌握其原理,不论多少宫格,都可以轻松应对.(代码可复制直接运行看效果). 该案例以四宫格入门,可扩展多宫格,奖品模块的布局可自由设置. <! ...
- CIBN手机电视8.3.2永久VIP
一款互联网电视的手机客户端.可以观看最新的电影和电视剧,还会为你推荐人气热门电影,让你不会错过每一部精彩的大片,以去除app内的所有可见广告,解锁VIP特权,无需登录直接使用! 下载地址:https: ...
- Restful规则及JPA导致内存溢出
HTTP动词 对于资源的具体操作类型,由HTTP动词表示. 常用的HTTP动词有下面五个(括号里是对应的SQL命令). GET(SELECT):从服务器取出资源(一项或多项). POST(CREATE ...
- Java——排序算法
java排序从大的分类来看,可以分为内排序和外排序:其中,在排序过程中只使用了内存的排序称为内排序:内存和外存结合使用的排序成为外排序. 下面讲的都是内排序. 内排序在细分可以这样分: 1.选择排序: ...
- Eureka系列(四) 获取服务Server端具体实现
获取服务 Server端流程 我们先看下面这张图片,这张图片简单描述了下我们EurekaClient在调用EurekaServer 提供的获取服务Http接口,Server端实现接口执行的大致流程 ...
- 软件测试最常用的 SQL 命令 | 掌握基本查询、条件查询、聚合查询
1.DML核心CRUD增删改查 缩写全称和对应 SQL: * DML 数据操纵语言:Data Manipulation Language * Create 增加:insert * Retrieve 查 ...