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

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

上级 133bcf31
...@@ -115,9 +115,7 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -115,9 +115,7 @@ public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/"+uploadpath).permitAll() .antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll() .antMatchers("/"+previewpath+"/**").permitAll()
//开放支付接口 //开放支付接口
.antMatchers("/trade/pagepay").permitAll() .antMatchers("/pay/trade/**").permitAll()
.antMatchers("/trade/precreate").permitAll()
.antMatchers("/trade/query").permitAll()
.anyRequest().authenticated() .anyRequest().authenticated()
// 防止iframe 造成跨域 // 防止iframe 造成跨域
.and().headers().frameOptions().disable(); .and().headers().frameOptions().disable();
......
...@@ -5,7 +5,9 @@ import cn.ibizlab.core.extensions.service.wechat.WechatPayConfig; ...@@ -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.PayOpenAccess;
import cn.ibizlab.core.pay.domain.PayTrade; import cn.ibizlab.core.pay.domain.PayTrade;
import cn.ibizlab.core.pay.service.IPayOpenAccessService; import cn.ibizlab.core.pay.service.IPayOpenAccessService;
import cn.ibizlab.core.pay.service.IPayTradeService;
import cn.ibizlab.util.errors.BadRequestAlertException; import cn.ibizlab.util.errors.BadRequestAlertException;
import cn.ibizlab.util.helper.HttpUtils;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayClient; import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient; import com.alipay.api.DefaultAlipayClient;
...@@ -15,9 +17,12 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; ...@@ -15,9 +17,12 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; 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.stereotype.Service;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.*; import java.util.*;
@Service @Service
...@@ -25,17 +30,20 @@ import java.util.*; ...@@ -25,17 +30,20 @@ import java.util.*;
public class PayCoreService { public class PayCoreService {
@Autowired @Autowired
@Lazy
IPayOpenAccessService openAccessService; IPayOpenAccessService openAccessService;
@Autowired
@Lazy
IPayTradeService tradeService;
//支付宝沙箱环境 @Value("${ibz.pay.ali.pagepay.returnurl:http://127.0.0.1:8080/pay/trade/pagepay/callback}")
private final String aliPayUrl="https://openapi.alipaydev.com/gateway.do"; 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 format="json";
private final String charset="UTF-8"; private final String charset="UTF-8";
private final String signType="RSA2"; private final String signType="RSA2";
private static Map<String,AlipayClient> aliPayClientMap = Collections.synchronizedMap(new HashMap<>()); private static Map<String,AlipayClient> aliPayClientMap = Collections.synchronizedMap(new HashMap<>());
/** /**
...@@ -49,7 +57,7 @@ public class PayCoreService { ...@@ -49,7 +57,7 @@ public class PayCoreService {
AlipayClient alipayClient = getAliPayClient(openAccess); AlipayClient alipayClient = getAliPayClient(openAccess);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl(openAccess.getRedirectUri()); request.setReturnUrl(openAccess.getRedirectUri());
request.setNotifyUrl(openAccess.getRedirectUri()); request.setNotifyUrl(ali_return_url);
request.setBizContent( request.setBizContent(
"{\"out_trade_no\":\""+ trade.getOutTradeNo() +"\"," "{\"out_trade_no\":\""+ trade.getOutTradeNo() +"\","
+ "\"total_amount\":\""+ trade.getTotalAmount() +"\"," + "\"total_amount\":\""+ trade.getTotalAmount() +"\","
...@@ -58,20 +66,64 @@ public class PayCoreService { ...@@ -58,20 +66,64 @@ public class PayCoreService {
+ "}"); + "}");
AlipayTradePagePayResponse response = alipayClient.pageExecute(request); AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) { if (response.isSuccess()) {
log.info("调用成功"); log.info("支付接口调用成功");
} else { } else {
log.error("调用失败"); log.error("支付接口调用失败");
} }
return response.getBody(); return response.getBody();
} }
/** /**
* 支付宝支付结果回调 * 支付平台回调:修改订单状态,回调业务系统
* @param trade * @param req
* @return * @return
*/ */
public String pagePayCallBack(PayTrade trade){ public String pagePayCallBack(HttpServletRequest req){
//更新payTrade status
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"; return "success";
} }
...@@ -132,67 +184,67 @@ public class PayCoreService { ...@@ -132,67 +184,67 @@ public class PayCoreService {
return rs; return rs;
} }
/** // /**
* 交易预创建,生成正扫二维码 // * 交易预创建,生成正扫二维码
* @param trade // * @param trade
*/ // */
@SneakyThrows // @SneakyThrows
private String aliPayPreCreate(PayOpenAccess openAccess,PayTrade trade){ // private String aliPayPreCreate(PayOpenAccess openAccess,PayTrade trade){
AlipayClient alipayClient = getAliPayClient(openAccess); // AlipayClient alipayClient = getAliPayClient(openAccess);
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); // AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setBizContent("{" + // request.setBizContent("{" +
"\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," + // "\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
"\"subject\":\""+trade.getSubject()+"\"," + // "\"subject\":\""+trade.getSubject()+"\"," +
"\"total_amount\":"+trade.getTotalAmount()+"," + // "\"total_amount\":"+trade.getTotalAmount()+"," +
" }"); // " }");
AlipayTradePrecreateResponse response = alipayClient.execute(request); // AlipayTradePrecreateResponse response = alipayClient.execute(request);
if(response.isSuccess()){ // if(response.isSuccess()){
System.out.println("调用成功"); // System.out.println("调用成功");
} else { // } else {
System.out.println("调用失败"); // System.out.println("调用失败");
} // }
return response.getQrCode(); // return response.getQrCode();
} // }
//
/** // /**
* 交易查询 // * 交易查询
* @param trade // * @param trade
*/ // */
@SneakyThrows // @SneakyThrows
private String aliPayQuery(PayOpenAccess openAccess,PayTrade trade){ // private String aliPayQuery(PayOpenAccess openAccess,PayTrade trade){
AlipayClient alipayClient = getAliPayClient(openAccess); // AlipayClient alipayClient = getAliPayClient(openAccess);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); // AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent("{" + // request.setBizContent("{" +
"\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," + // "\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
" }"); // " }");
AlipayTradeQueryResponse response = alipayClient.execute(request); // AlipayTradeQueryResponse response = alipayClient.execute(request);
if(response.isSuccess()){ // if(response.isSuccess()){
System.out.println("调用成功"); // System.out.println("调用成功");
} else { // } else {
System.out.println("调用失败"); // System.out.println("调用失败");
} // }
return response.getBody(); // return response.getBody();
} // }
//
/** // /**
* 撤销交易 // * 撤销交易
* @param trade // * @param trade
*/ // */
@SneakyThrows // @SneakyThrows
private String aliPayCancel(PayOpenAccess openAccess,PayTrade trade) { // private String aliPayCancel(PayOpenAccess openAccess,PayTrade trade) {
AlipayClient alipayClient = getAliPayClient(openAccess); // AlipayClient alipayClient = getAliPayClient(openAccess);
AlipayTradeCancelRequest request = new AlipayTradeCancelRequest(); // AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
request.setBizContent("{" + // request.setBizContent("{" +
"\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," + // "\"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
" }"); // " }");
AlipayTradeCancelResponse response = alipayClient.execute(request); // AlipayTradeCancelResponse response = alipayClient.execute(request);
if(response.isSuccess()){ // if(response.isSuccess()){
System.out.println("调用成功"); // System.out.println("调用成功");
} else { // } else {
System.out.println("调用失败"); // System.out.println("调用失败");
} // }
return response.getOutTradeNo(); // return response.getOutTradeNo();
} // }
/** /**
* 微信预创建订单 * 微信预创建订单
...@@ -283,7 +335,7 @@ public class PayCoreService { ...@@ -283,7 +335,7 @@ public class PayCoreService {
if(aliPayClientMap.get(appId)!=null){ if(aliPayClientMap.get(appId)!=null){
return aliPayClientMap.get(appId); 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); aliPayClientMap.put(appId,alipayClient);
return alipayClient; return alipayClient;
} }
......
...@@ -120,9 +120,7 @@ public class apiSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -120,9 +120,7 @@ public class apiSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/"+uploadpath).permitAll() .antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll() .antMatchers("/"+previewpath+"/**").permitAll()
//开放支付接口 //开放支付接口
.antMatchers("/trade/pagepay").permitAll() .antMatchers("/pay/trade/**").permitAll()
.antMatchers("/trade/precreate").permitAll()
.antMatchers("/trade/query").permitAll()
// 所有请求都需要认证 // 所有请求都需要认证
.anyRequest().authenticated() .anyRequest().authenticated()
// 防止iframe 造成跨域 // 防止iframe 造成跨域
......
...@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController @RestController
public class PayCoreResource { public class PayCoreResource {
...@@ -27,33 +28,33 @@ public class PayCoreResource { ...@@ -27,33 +28,33 @@ public class PayCoreResource {
PayTradeMapping payTradeMapping; PayTradeMapping payTradeMapping;
@ApiOperation(value = "预下单获取二维码", tags = {"获取二维码" }, notes = "预下单获取二维码") @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){ public ResponseEntity<JSONObject> preCreate(@Validated @RequestBody PayTradeDTO dto){
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.preCreate(payTradeMapping.toDomain(dto))); return ResponseEntity.status(HttpStatus.OK).body(payCoreService.preCreate(payTradeMapping.toDomain(dto)));
} }
@ApiOperation(value = "查询订单", tags = {"查询订单" }, notes = "查询订单") @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){ public ResponseEntity<JSONObject> query(@Validated @RequestBody PayTradeDTO dto){
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.query(payTradeMapping.toDomain(dto))); return ResponseEntity.status(HttpStatus.OK).body(payCoreService.query(payTradeMapping.toDomain(dto)));
} }
@ApiOperation(value = "取消订单", tags = {"取消订单" }, notes = "取消订单") @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){ public ResponseEntity<JSONObject> cancel(@Validated @RequestBody PayTradeDTO dto){
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.cancel(payTradeMapping.toDomain(dto))); return ResponseEntity.status(HttpStatus.OK).body(payCoreService.cancel(payTradeMapping.toDomain(dto)));
} }
@ApiOperation(value = "网页支付", tags = {"网页支付" }, notes = "网页支付") @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){ public ResponseEntity<String> pagePay(@Validated @RequestBody PayTradeDTO dto){
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.pagePay(payTradeMapping.toDomain(dto))); return ResponseEntity.status(HttpStatus.OK).body(payCoreService.pagePay(payTradeMapping.toDomain(dto)));
} }
@ApiOperation(value = "网页支付回调", tags = {"网页支付回调" }, notes = "网页支付回调") @ApiOperation(value = "网页支付回调", tags = {"网页支付回调" }, notes = "网页支付回调")
@RequestMapping(method = RequestMethod.GET,value = "/trade/pagepaycallback") @RequestMapping(value = "/pay/trade/pagepay/callback")
public ResponseEntity<String> pagePayCallBack(@Validated @RequestBody PayTradeDTO dto) { public ResponseEntity<String> pagePayCallBack(HttpServletRequest req) {
return ResponseEntity.status(HttpStatus.OK).body(payCoreService.pagePayCallBack(payTradeMapping.toDomain(dto))); 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 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册