支付宝&&微信PC端扫描支付小demo

####借鉴git上的大佬的准备工作说明,以及官方api说明。

准备工作:

1.配置AlipayConfig

(1).注册蚂蚁金服开发者账号(免费,不像苹果会收取费用)
注册地址:https://open.alipay.com ,用你的支付宝账号扫码登录,完善个人信息,选择服务类型(我选的是自研)。
在这里插入图片描述
(2).设置app_id和gatewayUrl

[外链图片转存失败(img-CKXmkP1a-1564928398170)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154523420-1165043884.png)]

[外链图片转存失败(img-1nDOmgcT-1564928398172)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154525998-1945276837.png)]

其中密钥需要自己生成,appID和支付宝网关是已经给好的,网关有dev字样,表明是用于开发测试。

(3).设置密钥

[外链图片转存失败(img-vp0uzIUw-1564928398173)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154527795-74942620.png)]

点击“生成方法”,打开界面如下:

[外链图片转存失败(img-bQoZp7s6-1564928398175)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154529482-463775295.png)]

下周密钥生成工具,解压打开后,选择2048位生成密钥:

[外链图片转存失败(img-Z80E4twi-1564928398179)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104155721716-114991997.png)]

如果没有设置过,此时显示文本是“设置应用公钥”,我这里是已经设置过得。

[外链图片转存失败(img-pH0MZ3fa-1564928398179)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154532888-1699829873.png)]

设置方法,“打开密钥文件路径”:

[外链图片转存失败(img-bAI2efxt-1564928398181)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104155723091-1059236432.png)]

[外链图片转存失败(img-cINV5gh4-1564928398182)(https://images2017.cnblogs.com/blog/913181/201711/913181-20171104154536326-1505768047.png)]

复制应用公钥2048.txt中的内容到点击“设置应用公钥”的弹出框中,保存:

[外链图片转存失败(img-YwkAzD1C-1564928398183)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104155724529-560291030.png)]

  • 商户私钥(merchant_private_key) 复制 应用私钥2048.txt 中的内容到merchant_private_key中。 - 支付宝公钥(alipay_public_key)

[外链图片转存失败(img-98GMK4F8-1564928398185)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154537920-690623311.png)]

点击如上图链接,复制弹出框里面的内容到alipay_public_key。 如果这个设置不对,结果是:支付成功,但是验签失败。 如果是正式环境,需要上传到对应的应用中:

[外链图片转存失败(img-DtVBa8xF-1564928398188)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154539248-1117011503.png)]

(4).服务器异步通知页面路径(notify_url) 如果没有改名,修改IP和端口号就可以了,我自己的如下:

(5).页面跳转同步通知页面路径(return_url)

http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp

4.测试运行

image

image

测试用的支付宝买家账户可以在“沙箱账号”这个页面可以找到:

[外链图片转存失败(img-aPkzjHnD-1564928688137)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154546045-990881709.png)]

支付成功后,验签结果:

[外链图片转存失败(img-vDFhFv3z-1564928696723)(http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154547279-197713081.png)]

问题解决 由于我们使用的是沙箱测试环境,测试环境和正式上线的环境的网关是不一样的,如果配置错误,会出现,appid错误的问题。配置如下

https://img-blog.csdn.net/20180620170947435?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpaGFpMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

项目结构:
[外链图片转存失败(img-cZOp08qr-1564928398192)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212150127-1265434591.png)]

只有一个Java配置类,其余都是JSP
Pay-Manager
[外链图片转存失败(img-baYCg2TZ-1564928398193)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212155281-42137637.png)]

Pom.xml

<!-- 只定义依赖的版本,不会实际依赖 -->
	<dependencies>

		<!-- 时间操作组件 -->
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>2.5</version>
		</dependency>
		<!-- Apache工具组件 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.3.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>commons-net</groupId>
			<artifactId>commons-net</artifactId>
			<version>3.3</version>
		</dependency>
		<!-- Jackson Json处理工具包 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.7.4</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.7.4</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>2.7.4</version>
		</dependency>
		<!-- httpclient -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.3.5</version>
		</dependency>
		<!-- 单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

		<!-- Mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.8</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.2</version>
		</dependency>
		<dependency>
			<groupId>com.github.miemiedev</groupId>
			<artifactId>mybatis-paginator</artifactId>
			<version>1.2.15</version>
		</dependency>
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
			<version>4.1.3</version>
		</dependency>
		<!-- MySql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.41</version>
		</dependency>

		<!-- 连接池 阿里巴巴数据源 全世界最牛逼的data source 没有之一 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.0</version>
		</dependency>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>4.3.3.RELEASE</version>
		</dependency>
		<!-- JSP相关 -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>
		<!-- 文件上传组件 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
		<!-- Redis客户端 -->
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.8.0</version>
		</dependency>
		<!-- solr客户端 -->
		<dependency>
			<groupId>org.apache.solr</groupId>
			<artifactId>solr-solrj</artifactId>
			<version>4.10.3</version>
		</dependency>
		<!-- fastDFS -->
		<dependency>
			<groupId>org.csource</groupId>
			<artifactId>fastdfs-client-java</artifactId>
			<version>1.27-RELEASE</version>
		</dependency>
		<!-- freemarker -->
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>2.3.23</version>
		</dependency>
		<!-- quartz -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.3</version>
		</dependency>

		<!-- use hibernate-validator to validate entity before enter controller -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.2.4.Final</version>
		</dependency>
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.1.0.Final</version>
		</dependency>

		<!-- spring rabbitmq -->
		<dependency>
			<groupId>org.springframework.amqp</groupId>
			<artifactId>spring-rabbit</artifactId>
			<version>1.5.6.RELEASE</version>
		</dependency>

		<!-- http://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
		<dependency>
			<groupId>commons-httpclient</groupId>
			<artifactId>commons-httpclient</artifactId>
			<version>3.1</version>
		</dependency>

		<!-- 日志处理 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.21</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.21</version>
		</dependency>

		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>17.0</version>
		</dependency>
		<dependency>
			<groupId>com.squareup.okhttp</groupId>
			<artifactId>mockwebserver</artifactId>
			<version>1.5.4</version>
			<scope>test</scope>
		</dependency>

		<!-- shiro -->
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-core</artifactId>
			<version>1.3.2</version>
			<exclusions>
				<exclusion>
					<artifactId>slf4j-api</artifactId>
					<groupId>org.slf4j</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-spring</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-ehcache</artifactId>
			<version>1.3.2</version>
			<exclusions>
				<exclusion>
					<artifactId>slf4j-api</artifactId>
					<groupId>org.slf4j</groupId>
				</exclusion>
			</exclusions>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
		<dependency>
			<groupId>com.sun.mail</groupId>
			<artifactId>javax.mail</artifactId>
			<version>1.5.6</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
		<!-- excel reporter -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.16</version>
		</dependency>

		<!-- alipay sdk -->
		<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
		<dependency>
			<groupId>com.alipay.sdk</groupId>
			<artifactId>alipay-sdk-java</artifactId>
			<version>3.1.0</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/xmlpull/xmlpull -->
		<dependency>
			<groupId>xmlpull</groupId>
			<artifactId>xmlpull</artifactId>
			<version>1.1.3.1</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/xpp3/xpp3 -->
		<dependency>
			<groupId>xpp3</groupId>
			<artifactId>xpp3</artifactId>
			<version>1.1.4c</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
		<dependency>
			<groupId>com.thoughtworks.xstream</groupId>
			<artifactId>xstream</artifactId>
			<version>1.4.9</version>
		</dependency>

		<dependency>
			<groupId>javax.xml.bind</groupId>
			<artifactId>jaxb-api</artifactId>
			<version>2.3.0</version>
		</dependency>
		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-impl</artifactId>
			<version>2.3.0</version>
		</dependency>
		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-core</artifactId>
			<version>2.3.0</version>
		</dependency>
		<dependency>
			<groupId>javax.activation</groupId>
			<artifactId>activation</artifactId>
			<version>1.1.1</version>
		</dependency>

		
	</dependencies>

Pay-Common
[外链图片转存失败(img-No5yY2Cj-1564928398194)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212225700-745050761.png)]
[外链图片转存失败(img-oeSsEjPG-1564928398195)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212230625-1357919542.png)]

Pojo:
逆向工程生成的,我后面会上数据表,跑一下逆向工程就可以出来的
[外链图片转存失败(img-DBtkSUbG-1564928398198)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212234490-316599115.png)]
[外链图片转存失败(img-zR9P5d4H-1564928398199)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212239528-365166324.png)]
[外链图片转存失败(img-Omi05Prc-1564928398200)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212243110-564283799.png)]
[外链图片转存失败(img-OAMcMNy6-1564928398201)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212247102-1502063023.png)]
[外链图片转存失败(img-iezKdcNk-1564928398202)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212250833-1865804431.png)]
[外链图片转存失败(img-tDurLM0L-1564928398204)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212255436-741847594.png)]
[外链图片转存失败(img-RoZpnDYw-1564928398205)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212259294-1434151616.png)]

Mapper:
[外链图片转存失败(img-GJomG09H-1564928398206)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212307608-243374730.png)]
[外链图片转存失败(img-C5Eox2kQ-1564928398207)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212311464-1446618809.png)]
[外链图片转存失败(img-g7HKx8l3-1564928398208)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212315617-666577205.png)]
[外链图片转存失败(img-w1OjZwOi-1564928398210)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212320006-928516663.png)]
[外链图片转存失败(img-St0oMIkc-1564928398211)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212324373-812810937.png)]

这些逆向工程出来的太多了,你懂的,所以我后面会上数据表,跑一下逆向工程就可以出来的。

Service:
[外链图片转存失败(img-0OZhFjoW-1564928398212)(https://img2018.cnblogs.com/blog/1611808/201907/1611808-20190708212332190-1205287140.png)]

OrdersServiceImpl:

package com.zsl.service.impl;

import java.util.Date;

import org.n3r.idworker.Sid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zsl.mapper.FlowMapper;
import com.zsl.mapper.OrdersMapper;
import com.zsl.pojo.Flow;
import com.zsl.pojo.Orders;
import com.zsl.service.OrdersService;
import com.zsl.utils.OrderStatusEnum;


@Service
public class OrdersServiceImpl implements OrdersService {

	@Autowired
	private OrdersMapper ordersMapper;
	
	@Autowired
	private FlowMapper flowMapper;
	
	@Autowired
	private Sid sid;
	
	@Override
	public void saveOrder(Orders order) {
		ordersMapper.insert(order);
	}

	@Override
	public Orders getOrderById(String orderId) {
		return ordersMapper.selectByPrimaryKey(orderId);
	}

	@Override
	public void updateOrderStatus(String orderId, String alpayFlowNum, String paidAmount) {
		
		Orders order = getOrderById(orderId);
		if (order.getOrderStatus().equals(OrderStatusEnum.WAIT_PAY.key)) {
			order = new Orders();
			order.setId(orderId);
			order.setOrderStatus(OrderStatusEnum.PAID.key);
			order.setPaidTime(new Date());
			order.setPaidAmount(paidAmount);
			
			ordersMapper.updateByPrimaryKeySelective(order);
			
			order = getOrderById(orderId);
			
			String flowId = sid.nextShort();
			Flow flow = new Flow();
			flow.setId(flowId);
			flow.setFlowNum(alpayFlowNum);
			flow.setBuyCounts(order.getBuyCounts());
			flow.setCreateTime(new Date());
			flow.setOrderNum(orderId);
			flow.setPaidAmount(paidAmount);
			flow.setPaidMethod(1);
			flow.setProductId(order.getProductId());
			
			flowMapper.insertSelective(flow);
		}
		
	}

}

ProductServiceImpl

package com.zsl.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zsl.mapper.ProductMapper;
import com.zsl.pojo.Product;
import com.zsl.pojo.ProductExample;
import com.zsl.service.ProductService;


@Service
public class ProductServiceImpl implements ProductService {

	@Autowired
	private ProductMapper productMapper;
	
	@Override
	public List<Product> getProducts() {
		
		ProductExample pe = new ProductExample();
//		Criteria pc = pe.createCriteria();
		List<Product> list = productMapper.selectByExample(pe);
		
		return list;
	}

	@Override
	public Product getProductById(String productId) {
		
		return productMapper.selectByPrimaryKey(productId);
	}

}

AlipayController

package com.zsl.controller;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.n3r.idworker.Sid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.zsl.pojo.Orders;
import com.zsl.pojo.Product;
import com.zsl.service.OrdersService;
import com.zsl.service.ProductService;
import com.zsl.utils.AlipayConfig;
import com.zsl.utils.LeeJSONResult;
import com.zsl.utils.OrderStatusEnum;

/**
 * 支付宝支付
 * 
 * @author Administrator
 *
 */
@Controller
@RequestMapping("/alipay")
public class AlipayController {

	final static Logger log = LoggerFactory.getLogger(AlipayController.class);

	@Autowired
	private ProductService productService;

	@Autowired
	private OrdersService orderService;

	@Autowired
	private Sid sid;

	/**
	 * 进入商品列表
	 * 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/products")
	public ModelAndView products() throws Exception {

		List<Product> pList = productService.getProducts();

		ModelAndView mv = new ModelAndView("products");
		mv.addObject("pList", pList);

		return mv;
	}

	/**
	 * 确认后查询商品信息
	 * 
	 * @param productId
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/goConfirm")
	public ModelAndView goConfirm(String productId) throws Exception {

		Product p = productService.getProductById(productId);

		ModelAndView mv = new ModelAndView("goConfirm");
		mv.addObject("p", p);

		return mv;
	}

	/**
	 * 创建订单
	 * 
	 * @param order
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/createOrder2")
	public ModelAndView createOrde2r(Orders order) throws Exception {

		Product p = productService.getProductById(order.getProductId());

		String orderId = sid.nextShort();
		order.setId(orderId);
		order.setOrderNum(orderId);
		order.setCreateTime(new Date());
		order.setOrderAmount(String.valueOf(Float.valueOf(p.getPrice()) * order.getBuyCounts()));
		order.setOrderStatus(OrderStatusEnum.WAIT_PAY.key);
		orderService.saveOrder(order);

		ModelAndView mv = new ModelAndView("goPay");
		mv.addObject("order", order);
		mv.addObject("p", p);

		return mv;
	}

	/**
	 * 创建订单
	 * 
	 * @param order
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/createOrder")
	@ResponseBody
	public LeeJSONResult createOrder(Orders order) throws Exception {

		Product p = productService.getProductById(order.getProductId());

		String orderId = sid.nextShort();
		order.setId(orderId);
		order.setOrderNum(orderId);
		order.setCreateTime(new Date());
		order.setOrderAmount(String.valueOf(Float.valueOf(p.getPrice()) * order.getBuyCounts()));
		order.setOrderStatus(OrderStatusEnum.WAIT_PAY.key);
		orderService.saveOrder(order);

		return LeeJSONResult.ok(orderId);
	}

	/**
	 * 付款
	 * 
	 * @param orderId
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/goPay")
	public ModelAndView goPay(String orderId) throws Exception {

		Orders order = orderService.getOrderById(orderId);

		Product p = productService.getProductById(order.getProductId());

		ModelAndView mv = new ModelAndView("goPay");
		mv.addObject("order", order);
		mv.addObject("p", p);

		return mv;
	}

	/**
	 * 支付宝付款
	 * 
	 * @param orderId
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/goAlipay", produces = "text/html; charset=UTF-8")
	@ResponseBody
	public String goAlipay(String orderId, HttpServletRequest request, HttpServletRequest response) throws Exception {

		Orders order = orderService.getOrderById(orderId);

		Product product = productService.getProductById(order.getProductId());

		// 获得初始化的AlipayClient
		AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,
				AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key,
				AlipayConfig.sign_type);

		// 设置请求参数
		AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
		alipayRequest.setReturnUrl(AlipayConfig.return_url);
		alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

		// 商户订单号,商户网站订单系统中唯一订单号,必填(随机生成)
		String out_trade_no = orderId;
		// 付款金额
		String total_amount = order.getOrderAmount();
		// 订单名称,必填
		String subject = product.getName();
		// 商品描述,可空
		String body = "购买数量:" + order.getBuyCounts();

		// 自定义超时时间参数timeout_express
		String timeout_express = "1c";

		alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount
				+ "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"timeout_express\":\""
				+ timeout_express + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

		// 请求
		String result = alipayClient.pageExecute(alipayRequest).getBody();

		return result;
	}

	/**
	 * 网页端用户付款成功后支付宝同步通知回调接口
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/alipayReturnNotice")
	public ModelAndView alipayReturnNotice(HttpServletRequest request, HttpServletRequest response) throws Exception {

		log.info("付款成功同步通知回调...");

		// 获取支付宝GET过来反馈信息
		Map<String, String> params = new HashMap<String, String>();
		Map<String, String[]> requestParams = request.getParameterMap();
		for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
			}
			// 乱码解决,这段代码在出现乱码时使用
			valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
			params.put(name, valueStr);
		}

		boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
				AlipayConfig.sign_type); // 调用SDK验证签名

		ModelAndView mv = new ModelAndView("alipaySuccess");
		//成功返回页面
		
		// 验证是否成功
		if (signVerified) {// 验证成功
			// 商户订单号
			String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

			// 支付宝交易号
			String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

			// 交易状态
			String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");

			// 进行业务操作
			orderService.updateOrderStatus(out_trade_no, trade_no, total_amount);

			Orders order = orderService.getOrderById(out_trade_no);
			Product product = productService.getProductById(order.getProductId());

			
			mv.addObject("out_trade_no", out_trade_no);
			mv.addObject("trade_no", trade_no);
			mv.addObject("total_amount", total_amount);
			mv.addObject("productName", product.getName());

		} else {// 验证失败
			log.info("验证失败...");
		}

		return mv;
	}

	/**
	 * 网页端用户付款成功后支付宝异步通知回调接口
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/alipayNotifyNotice")
	@ResponseBody
	public String alipayNotifyNotice(HttpServletRequest request, HttpServletRequest response) throws Exception {

		log.info("付款成功异步通知回调...");

		// 获取支付宝POST过来反馈信息
		Map<String, String> params = new HashMap<String, String>();
		Map<String, String[]> requestParams = request.getParameterMap();
		for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
			}
			// 乱码解决,这段代码在出现乱码时使用
			// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
			params.put(name, valueStr);
		}

		boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,
				AlipayConfig.sign_type); // 调用SDK验证签名

		
		if (signVerified) {// 验证成功
			// 商户订单号
			String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

			// 支付宝交易号
			String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

			// 交易状态
			String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

			// 交易金额
			String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");

			if (trade_status.equals("TRADE_FINISHED")) {
				// 判断该笔订单是否在商户网站中已经做过处理
				// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
				// 如果有做过处理,不执行商户的业务程序

				// 注意:
				// 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
			} else if (trade_status.equals("TRADE_SUCCESS")) {
				// 判断该笔订单是否在商户网站中已经做过处理
				// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
				// 如果有做过处理,不执行商户的业务程序

				// 注意:
				// 付款完成后,支付宝系统发送该交易状态通知
				orderService.updateOrderStatus(out_trade_no, trade_no, total_amount);

				Orders order = orderService.getOrderById(out_trade_no);
				Product product = productService.getProductById(order.getProductId());


			}
			log.info("验证成功...");

		} else {// 验证失败
			log.info("验证失败...");
		}

		return "success";
	}

}

最后上Mysql的表结构,数据不方便透露

/*
Navicat MySQL Data Transfer

Source Server         : wxdvideo
Source Server Version : 50721
Source Host           : localhost:3306
Source Database       : alipay

Target Server Type    : MYSQL
Target Server Version : 50721
File Encoding         : 65001

Date: 2019-07-08 21:30:18
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for flow
-- ----------------------------
DROP TABLE IF EXISTS `flow`;
CREATE TABLE `flow` (
  `id` varchar(20) NOT NULL,
  `flow_num` varchar(20) DEFAULT NULL COMMENT '流水号',
  `order_num` varchar(20) DEFAULT NULL COMMENT '订单号',
  `product_id` varchar(20) DEFAULT NULL COMMENT '产品主键ID',
  `paid_amount` varchar(11) DEFAULT NULL COMMENT '支付金额',
  `paid_method` int(11) DEFAULT NULL COMMENT '支付方式\r\n            1:支付宝\r\n            2:微信',
  `buy_counts` int(11) DEFAULT NULL COMMENT '购买个数',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水表';

-- ----------------------------
-- Table structure for orders
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` varchar(20) NOT NULL,
  `order_num` varchar(20) DEFAULT NULL COMMENT '订单号',
  `order_status` varchar(20) DEFAULT NULL COMMENT '订单状态\r\n            10:待付款\r\n            20:已付款',
  `order_amount` varchar(11) DEFAULT NULL COMMENT '订单金额',
  `paid_amount` varchar(11) DEFAULT NULL COMMENT '实际支付金额',
  `product_id` varchar(20) DEFAULT NULL COMMENT '产品表外键ID',
  `buy_counts` int(11) DEFAULT NULL COMMENT '产品购买的个数',
  `create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
  `paid_time` datetime DEFAULT NULL COMMENT '支付时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
  `id` varchar(20) CHARACTER SET utf8 NOT NULL,
  `name` varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT '产品名称',
  `price` varchar(11) DEFAULT NULL COMMENT '价格'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品表 ';

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` varchar(20) NOT NULL,
  `username` varchar(128) DEFAULT NULL,
  `sex` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偷偷学习被我发现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值