支付宝开放平台

扫码登录支付宝开放平台

沙箱环境

沙箱环境介绍
沙箱控制台
应用网关:该地址用于接收开放平台的异步通知。目前沙箱环境不需要配置此参数;

授权回调地址;第三方应用授权或获取用户信息中用于接收授权回调信息的地址。使用相关产品时需进行配置:

第三方应用授权:授权 url 中的 redirect_uri 必须与此值相同。

获取用户信息:授权 url 中的 redirect_uri 的域名必须与此值相同(例如:授权回调地址配置:https://auth.example.com/authCallBack 高亮部分需和授权url相同)。

RSA(SHA1)密钥:配置 RSA2(SHA256) 的应用公钥后,不需要配置 RSA(SHA1) 密钥。

AES 密钥:目前不再使用。
扫码测试的时候需要沙箱版支付宝App,目前只有安卓版
下载

配置

首先导入支付宝的依赖

<!--ali pay--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.1.0</version></dependency>

配置文件

alipay:app-id: # AppIDprivate-key: # 应用私匙 需要用支付宝助手生成public-key: # 支付宝公匙gateway: https://openapi.alipaydev.com/gateway.do

支付宝公匙点击RSA2(SHA256)密钥设置,然后查看

应用私匙:
会生成txt文件,然后复制到配置文件中

APPID和网关就不说了,需要注意的是正式接入支付宝的网关和沙箱环境的应用网关,区分是alipay.com/alipaydev.com

代码实现

构建支付信息视图对象PayInfoVO.java

@Data
@AllArgsConstructor
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@ApiModel("支付信息")
public class PayInfoVO implements Serializable {@ApiModelProperty("二维码URL")private String url;@ApiModelProperty("订单编号")private String orderId;@ApiModelProperty("商家名称")private String shopName;}

PayServiceImpl

@Service("PayServiceImpl")
@Slf4j
public class PayServiceImpl implements PayService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate ShopMapper shopMapper;@Value("${alipay.app-id}")private String appId;@Value("${alipay.private-key}")private String privateKey;@Value("${alipay.public-key}")private String publicKey;@Value("${alipay.gateway}")private String gateway;private AlipayClient alipayClient;@PostConstructpublic void init() {alipayClient = new DefaultAlipayClient(gateway,appId, privateKey, "json", "utf-8", publicKey, "RSA2");}@Overridepublic PayInfoVO getPayInfo(String orderId) {log.info("info ============= {}",orderId);// 根据订单id得到订单详情Order order = orderMapper.selectById(orderId);String sellId = order.getSellId();// 根据商家ID获取商家信息Shop shop = shopMapper.selectById(sellId);String shopSellName = shop.getSellName();AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();// 支付请求request.setBizContent("{" +"    \"out_trade_no\":\"" + orderId + "\"," +//商户订单号"    \"total_amount\":\"" + order.getOrderPrice().setScale(2, RoundingMode.CEILING) + "\"," +"    \"subject\":\"" + shopSellName + "当面付" + "\"," +"    \"store_id\":\"00100\"," + // (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持"    \"timeout_express\":\"5m\"}");//订单允许的最晚付款时间AlipayTradePrecreateResponse response = null;//支付宝二维码URLString qrCode = "";try {response = alipayClient.execute(request);if (!response.isSuccess()) {throw new CustomException("生成支付宝订单失败:" + response.getMsg());}qrCode = response.getQrCode();} catch (AlipayApiException e) {throw new CustomException(e.getMessage());}// 封装支付信息 返回PayInfoVO payInfoVO = new PayInfoVO();payInfoVO.setOrderId(order.getOrderId());payInfoVO.setShopName(shopSellName);payInfoVO.setUrl(qrCode);log.info("payInfo: {}",payInfoVO);return payInfoVO;}
}

controller

     @Autowired@Qualifier("PayServiceImpl")private PayService payService;@ApiOperation("返回支付二维码和支付信息")@GetMapping("/qr/{orderId}")public AjaxResult getPayInfo(@PathVariable String orderId) {PayInfoVO payInfoVO = payService.getPayInfo(orderId);return AjaxResult.success("支付成功", payInfoVO);}

支付状态

@AllArgsConstructor
@Getter
public enum PayStatusEnum {/** 等待扫码 */WAIT_SCANNED(0,"等待扫码"),/** 等待支付(已扫码,未支付) */UN_PROCESSED(1,"等待支付"),/** 商家已完成,等待骑手取餐 */PROCESSED(2,"已支付"),/** 订餐者关闭或者超时关闭 */SHIPPING(3,"已取消"),;private Integer code;private String msg;public static PayStatusEnum valueOf(Integer code){for (PayStatusEnum value : values()) {if (value.code.equals(code)) {return value;}}return null;}
}

支付结果对象

@Data
@ToString
public class PayResultDTO implements Serializable {//支付IDprivate Long payId;// 支付状态private Integer status;// 支付金额private BigDecimal amount;// 支付信息private String msg;
}

获取支付状态

// 根据orderId获取支付状态public PayResultDTO getPayStatus(String orderId) {log.info("status: ========= {}",orderId);//创建API对应的request类AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();request.setBizContent("{" +"    \"out_trade_no\":\"" + orderId + "\"}");AlipayTradeQueryResponse response = null;Order order = new Order();order.setOrderId(orderId);PayResultDTO payResultDTO = new PayResultDTO();try {response = alipayClient.execute(request);if (!response.isSuccess()) {// 获取支付信息失败payResultDTO.setStatus(PayStatusEnum.WAIT_SCANNED.getCode());payResultDTO.setMsg("等待扫码");return payResultDTO;}payResultDTO.setThirdPartId(response.getTradeNo());switch (response.getTradeStatus()) {case "WAIT_BUYER_PAY":payResultDTO.setStatus(PayStatusEnum.UN_PROCESSED.getCode());payResultDTO.setMsg("已扫码,等待用户支付");break;case "TRADE_CLOSED":payResultDTO.setStatus(PayStatusEnum.SHIPPING.getCode());payResultDTO.setMsg("支付已关闭");break;case "TRADE_SUCCESS":payResultDTO.setStatus(PayStatusEnum.PROCESSED.getCode());payResultDTO.setAmount(new BigDecimal(response.getTotalAmount()));payResultDTO.setMsg("支付成功");order.setPayStatus(Constants.PAY_STATUS_PAID);// 这里写支付成功的逻辑,例如设置支付时间,订单状态什么的break;default:break;}return payResultDTO;} catch (AlipayApiException e) {payResultDTO.setStatus(-1);payResultDTO.setMsg("查询订单状态错误:" + e.getErrMsg());return payResultDTO;}}

controller
获取支付状态

  @ApiOperation("获取支付状态")@GetMapping("/status/{orderId}")public AjaxResult getPayStatus(@PathVariable String orderId){PayResultDTO payStatus = payService.getPayStatus(orderId);return AjaxResult.success("支付状态对象",payStatus);}

最终测试


使用沙箱版App登录账户扫码支付

希望对大家有所帮助!

SpringBoot接入支付宝沙箱返回支付二维码相关推荐

  1. python制作微信二维码_Python提取支付宝和微信支付二维码的示例代码

    支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件 ...

  2. python 二维码_Python提取支付宝和微信支付二维码

    本文首发于我的个人博客,更多 Python 和 django 开发教程,请访问 追梦人物的博客. 支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二 ...

  3. python支付程序源码_Python提取支付宝和微信支付二维码的示例代码

    支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件 ...

  4. 通过C#生成支付宝收款码 四(支付宝官方SDK配合沙箱生成收款二维码)

    前面三个章节是学习和摸索过程,现在进入主题,生成收款码.还是用沙箱环境来调试. 1.新建windowsform程序,根据章节三,导入支付宝SDK. 2.下载官方当面付DEMO程序:当面付DEMO 3. ...

  5. Java 支付宝当面付生成二维码支付实现

    参考官方APIalipay.trade.precreate(统一收单线下交易预创建) maven依赖: <!-- 支付宝支付sdk --><dependency><gro ...

  6. 支付宝支付 第九集:产品数据和支付二维码对接

    支付宝支付 第九集:产品数据和支付二维码对接 一.问题 javascript中单引号和双引号的区别是什么? vue中的:作用 v-bind指令 二.代码 目录结构 更新AlipayServiceImp ...

  7. 支付宝支付 第六集:生成支付二维码

    支付宝支付 第六集:生成支付二维码 一.资源 支付宝沙箱显示APP-ID错误:我的原因是支付宝网关地址写错了 支付宝沙箱环境报 invalid-app-id 错误原因: 无效的AppID参数 错误 支 ...

  8. 一条语句完成微信、支付宝支付,生成支付二维码

    PayApiFun.dll这个动态库中包含了:微信付款码支付.生成微信支付二维码扫码支付.按商户单号查询微信支付状态.关闭未支付的微信订单.支付宝付款码支付.生成支付宝支付二维码扫码支付.按商户单号查 ...

  9. 微信支付宝合并为一个二维码支付的实现

    背景说明 我们是一个位于三线城市的购物中心,虽然已经开业多年,但是受益于良好的招商和日常运营,客流量在同城同类型项目中一直比较稳定.在节假日出场车流高峰期的时候,由于人工收费的效率问题,会导致车辆积压 ...

最新文章

  1. 最短路径 - dijkstra
  2. Dubbo系列(3)_官方Demo说明
  3. vue下使用 mint-ui,修改主题样式为微信UI的绿色风格
  4. 从古希腊神话说起,讲讲英语里的偏旁部首
  5. vm安装u盘linux,vmware 安装centos 插入u盘报错,大神请指导
  6. 在Windows平台如何选择C语言编译器?
  7. linux ntfs硬盘自动挂,linux下查看所有硬盘分区+挂接NTFS磁盘/硬盘+自动挂接硬盘方法...
  8. 逻辑回归、线性回归直观感受
  9. oracle电梯案例,Oracle技术嘉年华的一个案例,redo的那些事,连载一
  10. 数组乱码_python 爬虫随笔-土办法治乱码
  11. 麦克纳姆轮平台的两种构型
  12. 07.计算Nova→2.nova组件详解→2.nova-scheduler
  13. (转)功能测试(黑盒测试)常用的策略和方法
  14. java数字与大写字母转化_数字 和 大小写字母之间的转换 10进制和26进制之间的转换...
  15. 超前进位加法器(Carry-Lookahead Adder,CLA)
  16. 模型保存文件.npy
  17. opencv 应用程序无法正常启动0xc000007b
  18. 微信H5保存或下载视频到本地,将视频直接分享视频给好友
  19. 昨天的梦想 今天的幸福
  20. 用Arduino做一个能发射水弹的遥控小车

热门文章

  1. 嵌套饼图设置不同的颜色
  2. TVS管好,还是稳压二极管好?
  3. SSM+在线纳新系统 毕业设计-附源码241540
  4. html阴影效果骰子,flex布局案例(骰子)
  5. 两条命令彻底修复动态链接库
  6. Smart movie Java_智能影院下载-smartmovie智能影院【手机端+PC端+教程+工具】-东坡下载...
  7. 计算机网络设备网关属于固定资产,财政六大类常用固定资产分类及代码
  8. 【多目标优化求解】基于matlab非支配排序灰狼优化(NS-GWO)算法求解多目标优化问题【含Matlab源码 2015期】
  9. python爬虫教程:实例讲解Python爬取网页数据
  10. 团队RESTful 风格API规范