文章目录

  • 小提示
  • 逻辑图
  • 配置
    • pom.xml
    • pay-service-dev.yaml
    • bootstrap.yml
  • 开搞
    • AlipayProperties
    • AlipayConfig
    • 控制器各接口代码演示
    • 所对应的封装对象
      • PayVo支付接口参数对象
      • RefundVo退款接口参数对象
      • Result返回封装对象
    • 同步和异步回调接口url
      • 同步回调接口
      • 异步回调接口

小提示

  • 前提须知:支付宝开放平台及其SDK使用(没看此篇难懂以下讲解)
  • 支付宝开放平台链接:https://developers.alipay.com/platform/home.htm
  • 一个应用,包含一个公钥和一个密钥,也包含一个买家和一个卖家,只是沙箱模拟,有了公钥即可进行验签操作,本次演示有3处用到验签(1.同步回调,2.异步回调,3.将api生成的表单提交给支付宝网关)

逻辑图

  • 发起支付的时候需要传递6个参数(订单编号,付款金额,订单名称,商品描述,同步回调地址,异步回调地址) 给到支付宝api,然后支付宝会生成一个String类型的form表单(并且携带提交表单功能的js代码,此from表单不会显示在页面上看到,一生成就马上提交给支付宝网关了)返回,这个过程也称之为验签
  • 若此验签操作没问题后,则会在页面显示让你登陆你的支付宝账号和密码,随后输入支付密码进行支付
  • 支付成功后,则开始分别调用同步回调异步回调,两个回调方法内都会分别进行验签判断,确保是支付宝方来请求回调url才可进行后面的逻辑操作
  • 同步回调用来返回要显示的页面效果,异步回调用来做后台的逻辑操作(比如支付完后的订单,修改其状态)
  • 若要执行退款操作,则需要传递3个参数(交易订单号,退款金额,退款原因)给退款接口进行逻辑操作,退款成功则返回sucess

配置

pom.xml

   <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.10.170.ALL</version></dependency>

pay-service-dev.yaml

  • 这个放在配置中心上
server:port: 8051
ribbon:eager-load:enabled: true
rocketmq:producer:group: pay-group
alipay:app_id : 支付宝开放平台应用的appIdmerchant_private_key : 私钥数据alipay_public_key : 公钥数据sign_type : RSA2charset : utf-8gatewayUrl : https://openapi.alipaydev.com/gateway.do

bootstrap.yml

  • 这个放在本地idea中,拉去配置中心上的配置
spring:application:name: pay-servicecloud:nacos:config:server-addr: 192.168.8.12:8848 #nacos中心地址file-extension: yaml # 配置文件格式shared-configs:- data-id: nacos-discovery-config-dev.yamlprofiles:active: dev # 环境标识
  • 其他服务,要传入同步回调和异步回调Url,给到支付宝微服务去进行回调
  • 所以其他服务为了解决硬编码问题,将同步和异步回调的url自定义配置在了yml配置更加美观
  • 其他需要用到支付宝微服务的服务的application.yml(做参考就行)
pay:returnUrl: 同步回调的接口urlnotifyUrl: 异步回调的接口urlfrontEndPayUrl: 同步回调方法里,要显示给用户页面的url路径

开搞

  • pay-service微服务架构图

AlipayProperties

  • 通过@ConfigurationProperties(prefix = "alipay") 注入了yml配置文件对应的值给以下属性
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** Created by wolfcode-lanxw*/
@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "alipay")
public class AlipayProperties {//商品应用IDprivate String appId;// 商户私钥,您的PKCS8格式RSA2私钥private String merchantPrivateKey;// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。private String alipayPublicKey;// 签名方式private String signType ;// 字符编码格式private String charset;// 支付宝网关private String gatewayUrl ;
}

AlipayConfig

  • 将此包含了公钥等数据(可用作验签)的支付宝AlipayClient对象交给spring管理
@Configuration
public class AlipayConfig {@Beanpublic AlipayClient alipayClient(AlipayProperties alipayProperties){return new DefaultAlipayClient(alipayProperties.getGatewayUrl(), alipayProperties.getAppId(), alipayProperties.getMerchantPrivateKey(), "json", alipayProperties.getCharset(), alipayProperties.getAlipayPublicKey(), alipayProperties.getSignType());}
}

控制器各接口代码演示

  • payOnline接口:作为支付接口,接收PayVo对象(6个参数),通过alipayClient对象(内包含公钥)操作返回一个String类型的表单(包含js提交表单操作功能,此表单直接提交数据给支付宝网关,也就是验签操作),这里也相当于验签操作,成功以后,用户浏览器则出现登陆支付宝账号和密码页面,即可输入支付密码完成支付(商家余额增加,用户余额减少)
  • rsaCheck接口:用作同步异步回调时候的验签判断操作,防止中途数据被篡改,保证是支付宝方来访问的回调url操作
  • refundOnline接口:用作退款接口,接收RefundVo对象(3个参数),通过alipayClient对象(包含公钥,给支付宝作验签确保是哪个用户的余额)操作,返回boolean类型代表退款是否成功
@RestController
@RequestMapping("/alipay")
public class AlipayController {@Autowiredprivate AlipayClient alipayClient;@Autowiredprivate AlipayProperties alipayProperties;@RequestMapping("/payOnline")Result<String> payOnline(@RequestBody PayVo payVo) throws AlipayApiException {//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(payVo.getReturnUrl());alipayRequest.setNotifyUrl(payVo.getNotifyUrl());//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = payVo.getOutTradeNo();//付款金额,必填String total_amount = payVo.getTotalAmount();//订单名称,必填String subject = payVo.getSubject();//商品描述,可空String body = payVo.getBody();alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","+ "\"total_amount\":\"" + total_amount + "\","+ "\"subject\":\"" + subject + "\","+ "\"body\":\"" + body + "\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");String result = alipayClient.pageExecute(alipayRequest).getBody();return Result.success(result);}@RequestMapping("/rsaCheck")Result<Boolean> rsaCheck(@RequestBody Map<String, String> params) throws AlipayApiException {boolean signVerified = AlipaySignature.rsaCheckV1(params,alipayProperties.getAlipayPublicKey(),alipayProperties.getCharset(),alipayProperties.getSignType()); //调用SDK验证签名return Result.success(signVerified);}@RequestMapping("/refundOnline")public Result<Boolean> refundOnline(@RequestBody RefundVo refundVo) throws AlipayApiException {//设置请求参数AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();//商户订单号,商户网站订单系统中唯一订单号String out_trade_no = refundVo.getOutTradeNo();//支付宝交易号String trade_no = "";//请二选一设置//需要退款的金额,该金额不能大于订单金额,必填String refund_amount = refundVo.getRefundAmount();//退款的原因说明String refund_reason = refundVo.getRefundReason();//标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传String out_request_no = refundVo.getOutTradeNo();alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+ "\"trade_no\":\""+ trade_no +"\","+ "\"refund_amount\":\""+ refund_amount +"\","+ "\"refund_reason\":\""+ refund_reason +"\","+ "\"out_request_no\":\""+ out_request_no +"\"}");//请求AlipayTradeRefundResponse alipayTradeRefundResponse = alipayClient.execute(alipayRequest);return Result.success(alipayTradeRefundResponse.isSuccess());}
}

所对应的封装对象

PayVo支付接口参数对象

  • 用于传递给支付接口payOnline的参数对象
@Setter@Getter
public class PayVo {private String outTradeNo;//订单编号private String totalAmount; //付款金额,必填private String subject; //订单名称,必填private String body;//商品描述,可空private String returnUrl;//同步回调地址private String notifyUrl; //异步回调地址
}

RefundVo退款接口参数对象

@Setter@Getter
public class RefundVo implements Serializable {private String outTradeNo;//交易订单号private String refundAmount;//退款金额private String refundReason;//退款原因
}

Result返回封装对象

@Setter
@Getter
public class Result<T> implements Serializable {public static final int SUCCESS_CODE = 200;//成功码.public static final String SUCCESS_MESSAGE = "操作成功";//成功信息.public static final int ERROR_CODE = 500000;//错误码.public static final String ERROR_MESSAGE = "系统异常";//错误信息.private int code;private String msg;private T data;public Result(){}private Result(int code, String msg, T data){this.code = code;this.msg = msg;this.data = data;}public static <T> Result<T> success(T data){return new Result(SUCCESS_CODE,SUCCESS_MESSAGE,data);}public static <T> Result<T> success(String msg, T data){return new Result(SUCCESS_CODE,msg,data);}public static Result error(CodeMsg codeMsg){return new Result(codeMsg.getCode(),codeMsg.getMsg(),null);}public static Result defaultError(){return new Result(ERROR_CODE,ERROR_MESSAGE,null);}public boolean hasError(){//状态吗!=200 说明有错误.return this.code!=SUCCESS_CODE;}}

同步和异步回调接口url

  • 这里演示定义同步和异步回调接口,是在另一个服务中定义的(可做参考)
  • 先注入yml配置类中所定义的同步回调所要显示的页面url路径
  • 在回调接口内进行验签判断,确保是支付宝发来的请求,避免中途被篡改了数据
 @Value("${pay.frontEndPayUrl}")private String frontEndPayUrl;

同步回调接口

    /*** 同步回调 显示数据 让他重新跳转到订单详情界面*/@RequestMapping("/return_url")public void returnUrl(HttpServletResponse response, @RequestParam Map<String, String> params) throws IOException {System.out.println("同步回调");String orderNo = params.get("out_trade_no");
//            验签操作Result<Boolean> result = payFeignApi.rsaCheck(params);if (result.getData()) {response.sendRedirect(frontEndPayUrl + orderNo);} else {response.sendRedirect("localhost/50x.html");}response.sendRedirect(frontEndPayUrl + orderNo);}

异步回调接口

 /*** 异步回调*/@RequestMapping("/notify_url")public void notify_url(@RequestParam Map<String, String> params, HttpServletResponse response) throws IOException {System.out.println("异步回调" + new Date());PrintWriter out = response.getWriter();Result<Boolean> result = payFeignApi.rsaCheck(params);if (result != null || !result.hasError()) {if (result.getData()) {//                修改订单状态String orderNo = params.get("out_trade_no");orderInfoService.changePayStatus(orderNo);out.println("success");} else {out.println("fail");}} else {out.println("fail");}}

springcloud如何搭建支付宝pay-service微服务相关推荐

  1. springCloud与它的好兄弟微服务

    什么是spring could Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...

  2. 从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (中)

    本文承接上文<从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (上)> ...

  3. 从零开始搭建系统3.2——微服务注册中心开发及部署

    从零开始搭建系统3.2--微服务注册中心开发及部署 转载于:https://www.cnblogs.com/provence666/p/8638586.html

  4. Jenkins+GitLab+Docker+SpringCloud+Kubernetes实现可持续自动化微服务

    Jenkins+GitLab+Docker+SpringCloud+Kubernetes实现可持续自动化微服务

  5. 从0到1手把手搭建spring cloud alibaba 微服务大型应用框架(十五) swagger篇 : gateway 集成swagger 与 knife4j实现在线api文档并嵌入到自己项目内

    背景 我们日常开发中基本都是协同开发的,当然极个别的项目整体前后端都是一个人开发的,当多人协作时,尤其是前后端人员协同开发时 必然会面临着前端需要了解后端api接口的情况,两个选择,提前设计好文档,然 ...

  6. 自动化运维之k8s——Kubernetes集群部署、pod、service微服务、kubernetes网络通信

    目录 一.Kubernetes简介 1.Kubernetes简介 2.kubernetes设计架构 3.Kubernetes核心组件 4.kubernetes设计结构 二.Kubernetes部署 1 ...

  7. 搭建一个完整的微服务项目

    一.项目技术架构 1.技术栈 前台技术 Node.js.Npm.Vue.js.WebPack.Vue Cli.Element UI 后台架构 微服务架构:按照功能拆分N多个服务,每个服务可以独立技术选 ...

  8. springcloud架构特点_打造企业级微服务平台架构,分布式应用场景管理

    微服务平台架构是一项在云中部署应用和服务的新技术.大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务. 微服务系统可以在"自己的程序"中运行,并通过"轻量 ...

  9. 如何快速搭建一个 “简单模式” 的微服务架构

    何谓微服务架构的简单模式? 相对于大型互联网平台动辄几万并发的访问量,或者每天多次的在线版本发布,绝大多数企业和项目并没有这样的需求.他们关注的是如何更好地提高开发效率,如何更快地实现新需求,如何更便 ...

  10. hyperf搭建与使用RPC微服务

    文章目录 前言 一.微服务的场景演化 1.一开始 2.随着业务发展... 3.改造... 二.微服务与单体架构风格之间的区别 三.关于微服务存在的一些问题 四.RPC的那些事 1.概念 2.RPC或者 ...

最新文章

  1. 云栖社区 正文 永久免费SSL安全证书Letsencrypt安装使用方法
  2. CSS Sprites (转)
  3. 在 WSL2.0 的 Ubuntu 18 里使用 Docker
  4. 批量修改TS Profile、盘符计算器小工具
  5. linux7无法进入系统,记录一次断电导致centos7.4系统不能正常进入的解决方案
  6. snort简介以及在Ubuntu下的安装
  7. 深度残差网络_深度残差收缩网络:(三) 网络结构
  8. java sql结果写入csv文件_java在处理大数据的时候一些小技巧
  9. 【水】弱化版魔术球问题
  10. Revisiting Stereo Depth Estimation From a Sequence-to Sequence Perspective with Transformer——阅读阶段
  11. IntelliJ IDEA优化内存配置提高启动和运行速度
  12. windows性能监控Perfmon
  13. 宏观经济学gdp计算方法_宏观经济学答疑总结
  14. Python 判断无向图是否存在环
  15. HEX转BCD ,HEX转ASCII,HEX转DEC 算法合集 | C语言实现
  16. JavaScript之for循环、while循环 continue、break与代码规范
  17. 【转载】特来电电动汽车群智能充电系统,充电网、车联网、互联网“三网融合”新能源互联网平台
  18. 使用 Navicat 导出数据表的表结构到 excel
  19. 阿里云redis大key搜索工具
  20. 服务器kvm虚拟机安装uos系统,qemu/kvm 安装uos-server-20-enterprise-1030-arm64 异常

热门文章

  1. c#sql防注入模糊查询_c#模糊查询数据库
  2. ARTS打卡10-抓住海森堡Bug
  3. 搜狗浏览器显示服务器dns,为你设置win10系统下搜狗浏览器无法解析服务器的dns地址的处理对策...
  4. 基于 esp-idf 的 UART 应用例程解读
  5. 学会这5种排版方式,设计能力分分钟就能提高
  6. 前缀列表ip prefix-list
  7. es 创建索引 指定id_简单操作elasticsearch(es版本7.6)
  8. HTML网页的基本结构
  9. 深度学习英语-迭代法(01)故事法,一个新的尝试
  10. android ionic框架,移动App开发框架—Ionic