提交 5a3ef6d4 编写于 作者: zhouweidong's avatar zhouweidong

补充阿里网页支付回调业务系统

上级 133bcf31
......@@ -115,9 +115,7 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll()
//开放支付接口
.antMatchers("/trade/pagepay").permitAll()
.antMatchers("/trade/precreate").permitAll()
.antMatchers("/trade/query").permitAll()
.antMatchers("/pay/trade/**").permitAll()
.anyRequest().authenticated()
// 防止iframe 造成跨域
.and().headers().frameOptions().disable();
......
......@@ -5,7 +5,9 @@ import cn.ibizlab.core.extensions.service.wechat.WechatPayConfig;
import cn.ibizlab.core.pay.domain.PayOpenAccess;
import cn.ibizlab.core.pay.domain.PayTrade;
import cn.ibizlab.core.pay.service.IPayOpenAccessService;
import cn.ibizlab.core.pay.service.IPayTradeService;
import cn.ibizlab.util.errors.BadRequestAlertException;
import cn.ibizlab.util.helper.HttpUtils;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
......@@ -15,9 +17,12 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
@Service
......@@ -25,17 +30,20 @@ import java.util.*;
public class PayCoreService {
@Autowired
@Lazy
IPayOpenAccessService openAccessService;
@Autowired
@Lazy
IPayTradeService tradeService;
//支付宝沙箱环境
private final String aliPayUrl="https://openapi.alipaydev.com/gateway.do";
@Value("${ibz.pay.ali.pagepay.returnurl:http://127.0.0.1:8080/pay/trade/pagepay/callback}")
private String ali_return_url;
@Value("${ibz.pay.ali.gateway:https://openapi.alipaydev.com/gateway.do}")
private String ali_gateway;
private final String format="json";
private final String charset="UTF-8";
private final String signType="RSA2";
private static Map<String,AlipayClient> aliPayClientMap = Collections.synchronizedMap(new HashMap<>());
/**
......@@ -49,7 +57,7 @@ public class PayCoreService {
AlipayClient alipayClient = getAliPayClient(openAccess);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl(openAccess.getRedirectUri());
request.setNotifyUrl(openAccess.getRedirectUri());
request.setNotifyUrl(ali_return_url);
request.setBizContent(
"{\"out_trade_no\":\""+ trade.getOutTradeNo() +"\","
+ "\"total_amount\":\""+ trade.getTotalAmount() +"\","
......@@ -58,20 +66,64 @@ public class PayCoreService {
+ "}");
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
log.info("调用成功");
log.info("支付接口调用成功");
} else {
log.error("调用失败");
log.error("支付接口调用失败");
}
return response.getBody();
}
/**
* 支付宝支付结果回调
* @param trade
* 支付平台回调:修改订单状态,回调业务系统
* @param req
* @return
*/
public String pagePayCallBack(PayTrade trade){
//更新payTrade status
public String pagePayCallBack(HttpServletRequest req){
JSONObject paramMap=new JSONObject();
Enumeration names = req.getParameterNames();
while(names.hasMoreElements()) {
String key = (String)names.nextElement();
String value = req.getParameter(key);
paramMap.put(key,value);
}
String result_code=paramMap.getString("code");
// String result_sub_code=paramMap.getString("sub_code");
String out_trade_no=paramMap.getString("out_trade_no");
// String app_id=paramMap.getString("app_id");
String total_amount=paramMap.getString("total_amount");
// String trade_status=paramMap.getString("trade_status");
if(StringUtils.isEmpty(out_trade_no))
return String.format("没有找到[%s]订单信息",out_trade_no);
// String tradeId= DigestUtils.md5DigestAsHex(String.format(out_trade_no+"||"+app_id).getBytes());
PayTrade trade = tradeService.getOne(Wrappers.<PayTrade>lambdaQuery().eq(PayTrade::getOutTradeNo,out_trade_no).eq(PayTrade::getTradeStatus,"pending"));
if(trade==null)
return String.format("没有找到[%s]待付款订单",out_trade_no);
//确认订单金额
if(!total_amount.equals(trade.getTotalAmount()))
return String.format("交易订单金额[%s]与支付平台金额[%s]不吻合",total_amount,trade.getTotalAmount());
PayOpenAccess openAccess=trade.getOpenaccess();
if(openAccess==null){
openAccess= openAccessService.get(trade.getAccessId());
}
String return_url=openAccess.getRedirectUri();
if(StringUtils.isEmpty(return_url))
return String.format("无法获取[%s]开放平台回调地址",trade.getAccessId());
//修改订单状态
if(result_code.equals("10000")){
trade.setTradeStatus("success");
}else{
trade.setTradeStatus("fail");
}
tradeService.update(trade);
//回调业务系统
HttpUtils.post(return_url, null, paramMap);
return "success";
}
......@@ -132,67 +184,67 @@ public class PayCoreService {
return rs;
}
/**
* 交易预创建,生成正扫二维码
* @param trade
*/
@SneakyThrows
private String aliPayPreCreate(PayOpenAccess openAccess,PayTrade trade){
AlipayClient alipayClient = getAliPayClient(openAccess);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setBizContent("{" +
"\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
"\"subject\":\""+trade.getSubject()+"\"," +
"\"total_amount\":"+trade.getTotalAmount()+"," +
" }");
AlipayTradePrecreateResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return response.getQrCode();
}
/**
* 交易查询
* @param trade
*/
@SneakyThrows
private String aliPayQuery(PayOpenAccess openAccess,PayTrade trade){
AlipayClient alipayClient = getAliPayClient(openAccess);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent("{" +
"\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
" }");
AlipayTradeQueryResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return response.getBody();
}
/**
* 撤销交易
* @param trade
*/
@SneakyThrows
private String aliPayCancel(PayOpenAccess openAccess,PayTrade trade) {
AlipayClient alipayClient = getAliPayClient(openAccess);
AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
request.setBizContent("{" +
"\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
" }");
AlipayTradeCancelResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
return response.getOutTradeNo();
}
// /**
// * 交易预创建,生成正扫二维码
// * @param trade
// */
// @SneakyThrows
// private String aliPayPreCreate(PayOpenAccess openAccess,PayTrade trade){
// AlipayClient alipayClient = getAliPayClient(openAccess);
// AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
// request.setBizContent("{" +
// "\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
// "\"subject\":\""+trade.getSubject()+"\"," +
// "\"total_amount\":"+trade.getTotalAmount()+"," +
// " }");
// AlipayTradePrecreateResponse response = alipayClient.execute(request);
// if(response.isSuccess()){
// System.out.println("调用成功");
// } else {
// System.out.println("调用失败");
// }
// return response.getQrCode();
// }
//
// /**
// * 交易查询
// * @param trade
// */
// @SneakyThrows
// private String aliPayQuery(PayOpenAccess openAccess,PayTrade trade){
// AlipayClient alipayClient = getAliPayClient(openAccess);
// AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
// request.setBizContent("{" +
// "\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
// " }");
// AlipayTradeQueryResponse response = alipayClient.execute(request);
// if(response.isSuccess()){
// System.out.println("调用成功");
// } else {
// System.out.println("调用失败");
// }
// return response.getBody();
// }
//
// /**
// * 撤销交易
// * @param trade
// */
// @SneakyThrows
// private String aliPayCancel(PayOpenAccess openAccess,PayTrade trade) {
// AlipayClient alipayClient = getAliPayClient(openAccess);
// AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
// request.setBizContent("{" +
// "\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
// " }");
// AlipayTradeCancelResponse response = alipayClient.execute(request);
// if(response.isSuccess()){
// System.out.println("调用成功");
// } else {
// System.out.println("调用失败");
// }
// return response.getOutTradeNo();
// }
/**
* 微信预创建订单
......@@ -283,7 +335,7 @@ public class PayCoreService {
if(aliPayClientMap.get(appId)!=null){
return aliPayClientMap.get(appId);
}
AlipayClient alipayClient = new DefaultAlipayClient(aliPayUrl,openAccess.getAccessKey(),openAccess.getSecretKey(),format,charset,openAccess.getAccessToken(),signType);
AlipayClient alipayClient = new DefaultAlipayClient(ali_gateway,openAccess.getAccessKey(),openAccess.getSecretKey(),format,charset,openAccess.getAccessToken(),signType);
aliPayClientMap.put(appId,alipayClient);
return alipayClient;
}
......
......@@ -120,9 +120,7 @@ public class apiSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll()
//开放支付接口
.antMatchers("/trade/pagepay").permitAll()
.antMatchers("/trade/precreate").permitAll()
.antMatchers("/trade/query").permitAll()
.antMatchers("/pay/trade/**").permitAll()
// 所有请求都需要认证
.anyRequest().authenticated()
// 防止iframe 造成跨域
......
......@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class PayCoreResource {
......@@ -27,33 +28,33 @@ public class PayCoreResource {
PayTradeMapping payTradeMapping;
@ApiOperation(value = "预下单获取二维码", tags = {"获取二维码" }, notes = "预下单获取二维码")
@RequestMapping(method = RequestMethod.POST,value = "/trade/precreate")
@RequestMapping(method = RequestMethod.POST,value = "/pay/trade/precreate")
public ResponseEntity<JSONObject> preCreate(@Validated @RequestBody PayTradeDTO dto){
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.preCreate(payTradeMapping.toDomain(dto)));
}
@ApiOperation(value = "查询订单", tags = {"查询订单" }, notes = "查询订单")
@RequestMapping(method = RequestMethod.POST,value = "/trade/query")
@RequestMapping(method = RequestMethod.POST,value = "/pay/trade/query")
public ResponseEntity<JSONObject> query(@Validated @RequestBody PayTradeDTO dto){
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.query(payTradeMapping.toDomain(dto)));
}
@ApiOperation(value = "取消订单", tags = {"取消订单" }, notes = "取消订单")
@RequestMapping(method = RequestMethod.POST,value = "/trade/cancel")
@RequestMapping(method = RequestMethod.POST,value = "/pay/trade/cancel")
public ResponseEntity<JSONObject> cancel(@Validated @RequestBody PayTradeDTO dto){
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.cancel(payTradeMapping.toDomain(dto)));
}
@ApiOperation(value = "网页支付", tags = {"网页支付" }, notes = "网页支付")
@RequestMapping(method = RequestMethod.POST,value = "/trade/pagepay")
@RequestMapping(method = RequestMethod.POST,value = "/pay/trade/pagepay")
public ResponseEntity<String> pagePay(@Validated @RequestBody PayTradeDTO dto){
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.pagePay(payTradeMapping.toDomain(dto)));
}
@ApiOperation(value = "网页支付回调", tags = {"网页支付回调" }, notes = "网页支付回调")
@RequestMapping(method = RequestMethod.GET,value = "/trade/pagepaycallback")
public ResponseEntity<String> pagePayCallBack(@Validated @RequestBody PayTradeDTO dto) {
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.pagePayCallBack(payTradeMapping.toDomain(dto)));
@RequestMapping(value = "/pay/trade/pagepay/callback")
public ResponseEntity<String> pagePayCallBack(HttpServletRequest req) {
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.pagePayCallBack(req));
}
}
package cn.ibizlab.util.helper;
import com.alibaba.fastjson.JSONObject;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
/**
* 请求工具类
*/
public class HttpUtils {
private final static String DEFAULT_ENCODING = "UTF-8";
/**
* Post请求
*
* @return
*/
public static String post(String url) {
return post(url,null,null);
}
/**
*Post请求
* @param
* @return
*/
public static String post(String url,JSONObject headerMap,JSONObject paramMap) {
return doRestRequest(url,HttpMethod.POST,headerMap,paramMap);
}
/**
*put请求
* @param
* @return
*/
public static String put(String url, JSONObject headerMap,JSONObject paramMap) {
return doRestRequest(url,HttpMethod.PUT,headerMap,paramMap);
}
/**
* GET请求
*
* @param
* @return
*/
public static String get(String url) throws UnsupportedEncodingException {
return get(url,null,null);
}
/**
* GET请求
*
* @param
* @param
* @return
*/
public static String get(String url, JSONObject headerMap,JSONObject paramMap) throws UnsupportedEncodingException {
if(paramMap !=null){
boolean flag = true;
for(String key : paramMap.keySet()){
if(flag){
url += "?";
}else{
url += "&";
}
flag = false;
url = url + key + "=" + URLEncoder.encode(paramMap.getString(key),DEFAULT_ENCODING);
}
}
return doRestRequest(url,HttpMethod.GET,headerMap,paramMap);
}
/**
* DELETE请求
*
* @param
* @return
*/
public static String delete(String url) {
return delete(url,null,null);
}
/**
* DELETE请求
*
* @param
* @param
* @return
*/
public static String delete(String url, JSONObject headerMap,JSONObject paramMap) {
return doRestRequest(url,HttpMethod.DELETE,headerMap,paramMap);
}
public static String doRestRequest(String url, HttpMethod method, JSONObject headerMap, JSONObject paramMap){
RestTemplate restTemplate = getRestTemplate();
HttpHeaders headers = new HttpHeaders();
if(headerMap!=null){
for(String key : headerMap.keySet()){
headers.add(key,headerMap.getString(key));
}
}
MultiValueMap<String,String> params = new LinkedMultiValueMap<String,String>();
HttpEntity<String> entity;
if(paramMap!=null){
entity = new HttpEntity<>(paramMap.toString(), headers);
}else{
entity = new HttpEntity<>(null, headers);
}
ResponseEntity<String> responseEntity = restTemplate.exchange(url, method, entity, String.class);
return responseEntity.getBody();
}
public static InputStream requestInputStream(String url, JSONObject headerMap, JSONObject paramMap) throws IOException {
RestTemplate restTemplate = getRestTemplate();
HttpHeaders headers = new HttpHeaders();
if(headerMap!=null){
for(String key : headerMap.keySet()){
headers.add(key,headerMap.getString(key));
}
}
MultiValueMap<String,String> params = new LinkedMultiValueMap<String,String>();
HttpEntity<String> entity;
if(paramMap!=null){
entity = new HttpEntity<>(paramMap.toString(), headers);
}else{
entity = new HttpEntity<>(null, headers);
}
ResponseEntity<Resource> responseEntity = restTemplate.exchange(url, HttpMethod.GET, entity, Resource.class);
return responseEntity.getBody().getInputStream();
}
public static RestTemplate getRestTemplate(){
RestTemplate restTemplate = new RestTemplate();
for (HttpMessageConverter<?> httpMessageConverter : restTemplate.getMessageConverters()) {
if (httpMessageConverter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));
break;
}
}
return restTemplate;
}
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册