当时写的时候没注意,后来发现调的不是即时到账,也懒得改了,以后写注意,本次调的不是即时到账接口
1.配置文件配置相关配置
alipay:
dev: true //true沙箱 //false正式
sign-type: RSA2
app-id: 2016093000635565
private-key: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC0QgV8lV4KtNsUYUpxh094Byoa70MTjeXeO5UbVIqeLDd5cP1B4mP0/Og909sVciD9rTgI8UfJJyZhHdVfgBvdb68/oNBVeUOlDgiGnqBFAFxuBuTL5mZ5XEQxhKQr4CzW/wOAQp6c/mnN+mVNxljJZ3mGm8ok9fZkzArNM6cg7B8iOzYgaSnGdqea1CmNn6zpNBgNIkK4bAy75eo7X36r+90c4dwulufRRnZoJCoNIj/CRaowW5+mY4z9r1qTWQfRn43N5HEL00yvSl7lt7LdGF2N7oKegR1M/QuZOmuKSokV+64Bh4K82k1e2hNjAbRhDvtuhfTUmalDPSvSYYsxAgMBAAECggEBAITsyq78VsT+aS+2LvdZGLkiT2JdXdFlqkUfGu10gmPxp1beg2O6VouqlHhDaiN+beWjftbZVl53iE3FejtadTHt0gXRyM+/BKsKli7verBne8GHQ+E4ngiQiZkafxX70hUZKLPEbMLIua0zINEhmweqTmt9Jqvq1S+vZ6e6l1wmgo3+aBO4CBS7mmfUxOnXFo2PNZovAkCsnIcux2/dO+DFkqNimkEu513wnDMFLYPjopgb7dZ2vuVDCOJuRQLMAVdBbdflRo6eXd/KDXWqhvYShaGeUdbHmXPsLzZRUlfQ3i0PD+vsXyI5UOui+cMGN6rqiNheUJQU4iB1xhQ6FqECgYEA+suQ/ULEaR0zUefbGODISKa4KPYNk25PkF5H8VP4hCL4kqjFtqyWqZfEhSjr0BDiBfaOQsWyyBzUNMf/HOEaQcuqaQfRPjED8jhNdSD+gNn62kjew571vFPFuhvK5TkhEcFaXHuI5/EHViPiLiwr+dcarH2tsyXE3b2IWIW24ksCgYEAt/+zuY3DHehtgSjpqDkWnb2kz6OULIP2RsfsdkM1a4XpYV/eSdjpBHs8DRyiFFqpM6xzMA86ViOMTaD94Pg0U6wwMLeQxSmFQSIQjF7vCDmlkOSs0dQ6ObayUolBisK3L44F+uOKWR5/2P0/JSEjTo5Zkda+srt5GbjbJFszevMCgYEAyJlyy2BQQdN9bRILCYciLBpOS1Uj3rzpHwyKdtk3elmOgaBFJKw/hj9CjVAB7lbSsvpXJ8mCCtYkVmNyBuN2YRJKp9/82cXS5jdqnTla2C2CnH6Uz9uhqpVHHmmEjHx5mv4RDNAy3XLI73mcPFpQgnIvf7C28whOwx4KpOOvOKkCgYAszNigxFCOtqn6+dAygnvsOmGnoOeSEytivojnnqOiI3/YkrQX/PV3ft33P1KDbDOofkOpnvuQP6WIvTszjJuJB/LP2dIo/1wPqNCorPC8avTSG6ush2UJ6l7u07aep5xcutLf7Ikh+9gbKEY4ryHenbBXXxcdg6IPzj+lUYNuWwKBgQD4X5YY+T/OeQSuhiUY7zHAB+ptJsPiPklz4VZyIFBj5xcah8bv8Jdg9wWXAD4qrnmNTG9FIa6epm3BFiRzriB79Mvk1AWH/M7OeOP1q9oQaT9ljnV1FJuqn+HJBaZZsjms3YxSXfDncxoQF2INlWpsHp9KuZ0hH5wiXeQ24UaewQ==
alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr4vzGWyx7GcG33zm5pz7v4QlNK7Gr/kmjLFritFl9TLxplxwF67b1SyEDZeSTBu3cAp+D9WmLsnaluRBe1N3vvLJUAPULxDvyVroMl5NOIZMhGt15P5HZavOrRzX/69adKNxnSz+d35Ab0k3jEHL9MTBsb4lbl+KRQPBHwv5DhOsLxg05oN8iAZpmfHIN5QGaqL5FqB4Th2ERvANu0eI1hxZ7jSa+b233riJNa9PHISz5NdI0p/TXWlMMeDa4Q4CeXK0wpGi6nq64uZg+zZza/+ocUQDwvtgXtX9LNjVU/m0E42lWWXdLyz+rrwREmq6SxHSVW/usg7lhuIX58VOVQIDAQAB
notify-url: http://localhost:8085/alipay/notify
# return-url: http://localhost:9520/#/pubOrder/pubOrderList
return-url: http://localhost:8085/alipay/return
gateway-url: https://openapi.alipaydev.com/gateway.do
2.建一个类读取配置文件
package com.mj.mall.config.alipay;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import lombok.Data;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 支付宝支付设置
* @author jitwxs
* @since 2018/6/4 19:04
*/
@Configuration
@Data
public class AliPayConfig {
@Value("${alipay.gateway-url}")
private String gatewayUrl;
@Value("${alipay.app-id}")
private String appId;
@Value("${alipay.private-key}")
private String privateKey;
@Value("${alipay.alipay-public-key}")
private String alipayPublicKey;
@Value("${alipay.sign-type}")
private String signType;
// @Value("${alipay.uid}")
// private String sellerId;
@Value("${alipay.notify-url}")
private String notifyUrl;
@Value("${alipay.return-url}")
private String returnUrl;
@Bean
AlipayClient alipayClient() {
return new DefaultAlipayClient
(gatewayUrl, appId, privateKey, "json", "utf-8", alipayPublicKey, signType);
}
}
3.Controller
package com.mj.mall.controller;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.mj.mall.bean.AlipayVo;
import com.mj.mall.config.alipay.AliPayConfig;
import com.mj.mall.service.PubOrderService;
import com.mj.mall.util.CommonUtil;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
/**
* @author: hxy
* @description: 用户/角色/权限相关controller
* @date: 2017/11/2 10:19
*/
@RestController
@RequestMapping("/alipay")
public class AlipayController {
@Autowired
private AliPayConfig aliPayConfig;
@Autowired
private AlipayClient alipayClient;
@Autowired
private PubOrderService pubOrderService;
@GetMapping("/pay")
public JSONObject pay( HttpServletRequest request,HttpServletResponse response) throws AlipayApiException, IOException {
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//异步通知地址
alipayRequest.setReturnUrl(aliPayConfig.getReturnUrl());
// 服务器异步通知页面路径
alipayRequest.setNotifyUrl(aliPayConfig.getNotifyUrl());
// 2、SDK已经封装掉了公共参数,这里只需要传入业务参数,请求参数查阅开头Wiki
Map<String,String> map = new HashMap<>(16);
map.put("out_trade_no", UUID.randomUUID().toString().replace("-", ""));
map.put("total_amount", "100");
map.put("subject", "测试");
// 销售产品码
map.put("product_code","FAST_INSTANT_TRADE_PAY");
//map.put("timeout_express","");
//公共校验参数
//map.put("passback_params","");
alipayRequest.setBizContent(JSONObject.toJSONString(CommonUtil.request2Json(request)));
AlipayTradePagePayResponse alipayResponse=alipayClient.pageExecute(alipayRequest);
return CommonUtil.successJson(alipayResponse.getBody());
}
@PostMapping("/notify")
public void alipayNotify(HttpServletRequest request, HttpServletResponse response){
/*
默认只有TRADE_SUCCESS会触发通知,如果需要开通其他通知,请联系客服申请
触发条件名 触发条件描述 触发条件默认值
TRADE_FINISHED 交易完成 false(不触发通知)
TRADE_SUCCESS 支付成功 true(触发通知)
WAIT_BUYER_PAY 交易创建 false(不触发通知)
TRADE_CLOSED 交易关闭 false(不触发通知)
来源:https://docs.open.alipay.com/270/105902/#s2
*/
// 获取参数
Map<String,String> params = getPayParams(request);
try{
// 验证订单
boolean flag = pubOrderService.validOrder(params);
if(flag) {
//商户订单号
String orderId = params.get("out_trade_no");
//支付宝交易号
String tradeNo = params.get("trade_no");
//交易状态
String tradeStatus = params.get("trade_status");
JSONObject jsonObject=new JSONObject();
jsonObject.put("orderSn",orderId);
jsonObject.put("tradeNo",tradeNo);
switch (tradeStatus) {
case "WAIT_BUYER_PAY":
jsonObject.put("status",0);
break;
/*
* 关闭订单
* (1)订单已创建,但用户未付款,调用关闭交易接口
* (2)付款成功后,订单金额已全部退款【如果没有全部退完,仍是TRADE_SUCCESS状态】
*/
case "TRADE_CLOSED":
jsonObject.put("status",4);
break;
/*
* 订单完成
* (1)退款日期超过可退款期限后
*/
case "TRADE_FINISHED" :
jsonObject.put("status",3);
break;
/*
* 订单Success
* (1)用户付款成功
*/
case "TRADE_SUCCESS" :
jsonObject.put("status",1);
break;
default:break;
}
pubOrderService.updateOrder(jsonObject);
System.out.println("返回支付宝success");
response.getWriter().write("success");
}else {
// log.error("【支付异步方法】验证失败,错误信息:{}", AlipaySignature.getSignCheckContentV1(params));
response.getWriter().write("fail");
}
} catch (Exception e){
// log.error("【支付异步方法】异常,异常信息:{}", e.getMessage());
e.printStackTrace();
}
}
// @GetMapping("/return")
// public void alipayReturn(HttpServletRequest request, HttpServletResponse response) {
// // 获取参数
// Map<String,String> params = getPayParams(request);
// System.out.println("支付宝交易号"+params);
// }
//
//
// /**
// * 获取支付参数
// * @author jitwxs
// * @since 2018/6/4 16:39
// */
// private Map<String,String> getPayParams(HttpServletRequest request) {
// Map<String,String> params = new HashMap<>(16);
// Map<String,String[]> requestParams = request.getParameterMap();
//
// Iterator<String> iter = requestParams.keySet().iterator();
// while (iter.hasNext()) {
// String name = iter.next();
// String[] values = 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);
// }
// return params;
// }
}