本项目中其他模块内容:
微服务架构下如何集成支付宝接口实现支付服务(一)总体设计.
微服务架构下如何集成支付宝接口实现支付服务(二)使用SpringCloudConfig搭建配置中心.
微服务架构下如何集成支付宝接口实现支付服务(三)结合配置中心搭建eureka服务注册中心.
微服务架构下如何集成支付宝接口实现支付服务(四)集成alipay来提供支付服务.
微服务架构下如何集成支付宝接口实现支付服务(五)消费支付服务的消费者搭建.
微服务架构下如何集成支付宝接口实现支付服务(六)支付宝接口(沙箱环境)申请.
provider工程主要就是来提供支付服务的,可以被其他业务层来调用。
1、pom文件
首先来看一下pom文件,需要依赖哪些配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.shqblog</groupId>
<artifactId>blog</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>blog-provider-pay-8001</artifactId>
<dependencies>
<dependency>
<groupId>com.shqblog</groupId>
<artifactId>blog-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- eureka客户端配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
<!-- config配置中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- actuator监控信息完善 --><!-- 会被hystix dashboard监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 支付宝功能 -->
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.110.ALL</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
2、文件目录结构
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9cWTxMmeOpXSq1EM4wmYwhGWhxGZzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcukzM1MDM1ATM3EzNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
AliPayProperties.java是从yml中获取支付宝的基础配置参数。
主要参数有:(https://docs.open.alipay.com/270/105899/)(或者下图)
其他的就是对支付信息进行的数据库存储过程。
3、配置文件
-
bootstrap.yml
该文件是系统级配置文件,在该文件中去获取config配置中心的内容
spring:
cloud:
config:
name: blog-provider-pay #需要从github上读取的资源名称,注意没有yml后缀名
profile: dev # 本次访问的配置项
label: master
uri: http://localhost:3344 #这个是配置中心的地址
-
application.yml
这个应该是空的,因为配置文件都从配置中心获得。
配置中心如何架设:
请将下面的配置写到配置中心,从配置中心中获取
docker:
url: 172.17.251.66
server:
port: 8001
mybatis:
#config-location: classpath:mybatis/mybatis.cfg.xml
type-aliases-package: com.shqblog.entity # entity所在路径
mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件
configuration:
# mapUnderscoreToCamelCase: true # 开启驼峰命名法
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
spring:
profiles: dev
application:
name: blog-pay
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/pay
username: root
password: root
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
jackson:
date-format: yyyy-MM-dd HH:mm:ss
joda-date-time-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
eureka:
client: #客户端注册金eureka服务列表中
service-url:
defaultZone: http://localhost:6731/eureka/
#在微服务列表中注册的名字是spring.application.name的名字
instance:
instance-id: blog-pay:8001
prefer-ip-address: true
enabled: true
register-with-eureka: true
fetch-registry: true
info:
app.name: shablog
company.name: www.shqblog.com
build.artifactId: $project.artifactId$
bulid.version: $project.version$
alipay:
serverUrl: https://openapi.alipay.com/gateway.do
appId: #沙盒应用的ID
privateKey: #你自己的私钥
formatL: json
charset: utf-8
alipayPulicKey: #alipay的公钥
signType: RSA2
4、启动器配置
PayProvider8001_APP.java这个文件
@SpringBootApplication
@EnableEurekaClient//本服务启动后会自动注册金eureka服务中
@EnableDiscoveryClient//启动eureka的服务发现
public class PayProvider8001_APP {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(PayProvider8001_APP.class, args);
}
}
5、接口核心代码
开放的支付服务的接口是在PayController.java
下面是核心代码
@PostMapping("/pay")
//AlipayBizParameters 是在Api模块中的Dto(数据传输类)
//这里要注意一下AlipayBizParameters 前必须加上@RequestBody,因为feign来传输参数的时候都是封装成json数据格式。
public String pay(HttpServletResponse httpResponse,@RequestBody AlipayBizParameters alipayBizParameters)throws ServletException, IOException{
AlipayClient alipayClient = new DefaultAlipayClient(aliPayProperties.getServerUrl(),aliPayProperties.getAppId(),aliPayProperties.getPrivateKey(),aliPayProperties.getFormat(),aliPayProperties.getCharset(),
aliPayProperties.getAlipayPulicKey(),aliPayProperties.getSignType()); //获得初始化的AlipayClient
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
alipayRequest.setReturnUrl(/*"http://domain.com/CallBack/return_url.jsp"*/alipayBizParameters.getReturnUrl());
alipayRequest.setNotifyUrl(/*"http://domain.com/CallBack/notify_url.jsp"*/alipayBizParameters.getNotifyUrl());//在公共参数中设置回跳和通知地址
//ReturnUrl是回跳的返回地址,在执行完支付操作之后,调回你项目的地址,必须是外网的一个地址,写内网的话无法访问,这里可以用内网穿透
//NotifyUrl是异步通知地址,支付宝除了会让网页回跳到你的项目,还会异步的发一条通知,是以json格式发送的,具体字段可以从https://docs.open.alipay.com/270/105902/获取。
alipayRequest.setBizContent(/*"{" +
" \"out_trade_no\":\"20150320010101001\"," +
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
" \"total_amount\":88.88," +
" \"subject\":\"Iphone6 16G\"," +
" \"body\":\"Iphone6 16G\"," +
" \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\"," +
" \"extend_params\":{" +
" \"sys_service_provider_id\":\"2088511833207846\"" +
" }"+
" }"*/alipayBizParameters.getJson());//填充业务参数
//这里alipayBizParameters.getJson()是在数据传输类里定义的一个方法,是将所有的属性值生成一个json格式的字符串返回出来。
String form="";
try {
AlipayTradePagePayResponse response = alipayClient.pageExecute(alipayRequest);
form = response.getBody(); //调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
}
//这里返回值是一个表单,这个表单是进行页面跳转的代码。返回给调用该接口的业务。
return form;
}
接收异步返回的数据值
//这个方法必须是使用post格式。
@PostMapping("/alipayNotify")
public void alipayNotify(AlipayNotifyUrlParameters alipayNotifyUrlParameters){
System.out.println(alipayNotifyUrlParameters);
}
//这里本来应该通过拿到的sign和sign_type进行异步返回结果的验签,但是这里就简单打印出来,没有做这个。
// charset=utf-8&
// out_trade_no=20150320010101002&
// method=alipay.trade.page.pay.return&
// total_amount=50.00&
// sign=xwLZp4XCgd0dm9V23u6WyQDkEYFN%2B%2FqODI%2B95pBClRr8hVpeRwEP4Uzu%2Ffjxh3aVsKN9GKkyaM10flp8DPkGxrAswyQ0Eravo7DshMLl%2F4O8HKGYhxgL%2FykX5BvYuUzHpdm9KT8UhWT5zWESYYztuUkgbVwPMJ7dlGaR5f5NbHHjUvJCXIjtp4iqewi4cZPi%2FDuVCodjI6wNU8TAPFNKjy3eJzabeVWCTc73SvnZIxsjTPxWU6sn3jjbJHp3ZxXsUvz%2Fow4%2F4pNQ4OmimE1lwrhfpagUy6adBYo6D%2Be9ittpZmowRvAF0ild8cA5EftS6gTqN06QT%2Frs21%2FfZzZCkA%3D%3D&
// trade_no=2019071522001433401000022172&
// auth_app_id=2016101100662295&
// version=1.0&
// app_id=2016101100662295&
// sign_type=RSA2&
// seller_id=2088102179110312&
// timestamp=2019-07-15+20%3A25%3A53
}