天天看点

微服务架构下如何集成支付宝接口实现支付服务(四)集成alipay来提供支付服务

本项目中其他模块内容:

微服务架构下如何集成支付宝接口实现支付服务(一)总体设计.

微服务架构下如何集成支付宝接口实现支付服务(二)使用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、文件目录结构

微服务架构下如何集成支付宝接口实现支付服务(四)集成alipay来提供支付服务

AliPayProperties.java是从yml中获取支付宝的基础配置参数。

主要参数有:(https://docs.open.alipay.com/270/105899/)(或者下图)

微服务架构下如何集成支付宝接口实现支付服务(四)集成alipay来提供支付服务

其他的就是对支付信息进行的数据库存储过程。

3、配置文件

  1. bootstrap.yml

    该文件是系统级配置文件,在该文件中去获取config配置中心的内容

spring: 
  cloud:
    config:
      name: blog-provider-pay #需要从github上读取的资源名称,注意没有yml后缀名
      profile: dev    # 本次访问的配置项
      label: master
      uri: http://localhost:3344   #这个是配置中心的地址
      
           
  1. 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
	
}
           

继续阅读