支付宝订单正式方式

This commit is contained in:
yuyang 2021-10-15 17:14:02 +08:00
parent 568cce07b0
commit 584d854f42
11 changed files with 377 additions and 77 deletions

View File

@ -81,6 +81,7 @@ public class XhpcChargingPileServiceImpl implements IXhpcChargingPileService {
Long rateModelId = Long.parseLong(StringUtils.valueOf(stringObjectMap.get("rateModelId")));
xhpcChargingPile.setRateModelId(rateModelId);
String serialNumber = xhpcChargingPile.getSerialNumber();
xhpcChargingPile.setCreateTime(new Date());
//判断桩编号是否重复
int count = xhpcChargingPileMapper.getXhpcChargingPileSerialNumberCount(serialNumber);
if (count > 0) {

View File

@ -22,6 +22,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.math.BigDecimal;
import java.util.*;
@ -395,21 +396,37 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi
if(list.size() == 1){
if(!"00:00:00".equals(xhpcRateTimeDto.getStartTime())){
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
sort= addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, "00:00:00", startTime, sort, 2, rateValue);
}
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues);
if(!endTime.equals("24:00:00")) {
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTime, "24:00:00", sort, 2, rateValue);
}
}else{
if(k == 0){
if(!"00:00:00".equals(xhpcRateTimeDto.getStartTime())){
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
sort= addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, "00:00:00", startTime, sort, 2, rateValue);
}
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues);
}else if(k < list.size()-1){
String endTimeK = list.get(k - 1).getEndTime();
if (!endTimeK.equals(startTime)) {
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTimeK, startTime, sort, 2, rateValue);
}
//并把本条数据也添加上
@ -417,12 +434,20 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi
}else{
String endTimeK = list.get(k - 1).getEndTime();
if (!endTimeK.equals(startTime)) {
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
//添加一条默认费率时段
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTimeK, startTime, sort, 2, rateValue);
}
//并把本条数据也添加上
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues);
if (!endTime.equals("24:00:00")) {
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
//添加一条默认费率时段
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTime, "24:00:00", sort, 2, rateValue);
}
@ -619,7 +644,7 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi
//终端状态用 redis数据
if(map.get("serialNumber") !=null){
Map<String, Object> cacheMap =redisService.getCacheMap("gun:"+map.get("serialNumber").toString());
if(cacheMap !=null){
if(!cacheMap.isEmpty()){
if("空闲".equals(cacheMap.get("status"))){
map.put("status", 2);
}else if ("离线".equals(cacheMap.get("status"))){
@ -657,10 +682,10 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi
}
}
}else{
map.put("status", 1);
map.put("status", 5);
}
}else{
map.put("status", 1);
map.put("status", 5);
}
}
}
@ -691,11 +716,6 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi
if (xhpcChargingStationDto.getChargingStationId() == null) {
return AjaxResult.error("1001", "电站id为空");
}
//电站id不能为空
if (xhpcChargingStationDto.getDefaultPeriodId() == null) {
return AjaxResult.error("1001", "默认时段费率id为空");
}
//判断费率和费率时间段 是否有值
if (xhpcChargingStationDto.getXhpcRateList() == null && xhpcChargingStationDto.getXhpcRateList().size() == 0) {
return AjaxResult.error(1001, "费率不能为空");
@ -822,21 +842,37 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi
if(list.size() == 1){
if(!"00:00:00".equals(xhpcRateTimeDto.getStartTime())){
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
sort= addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, "00:00:00", startTime, sort, 2, rateValue);
}
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues);
if(!endTime.equals("24:00:00")) {
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTime, "24:00:00", sort, 2, rateValue);
}
}else{
if(k == 0){
if(!"00:00:00".equals(xhpcRateTimeDto.getStartTime())){
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
sort= addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, "00:00:00", startTime, sort, 2, rateValue);
}
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues);
}else if(k < list.size()-1){
String endTimeK = list.get(k - 1).getEndTime();
if (!endTimeK.equals(startTime)) {
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTimeK, startTime, sort, 2, rateValue);
}
//并把本条数据也添加上
@ -844,12 +880,20 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi
}else{
String endTimeK = list.get(k - 1).getEndTime();
if (!endTimeK.equals(startTime)) {
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
//添加一条默认费率时段
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTimeK, startTime, sort, 2, rateValue);
}
//并把本条数据也添加上
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues);
if (!endTime.equals("24:00:00")) {
if(rateValue ==null || "".equals(rateValue)){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return AjaxResult.error("请填写默认时间段费率");
}
//添加一条默认费率时段
sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTime, "24:00:00", sort, 2, rateValue);
}

View File

@ -195,6 +195,7 @@ public class XhpcPileOrderController extends BaseController {
JSONObject json = new JSONObject(map);
//消息对了内容
webSocketService.getMessage(userId+"",json.toString());
logger.info("桩实时数据发送WebSocket成功>>>>>orderNo" + orderNo);
} catch (Exception e) {
Map<String, Object> map = new HashMap<>();
map.put("code", 500);

View File

@ -77,18 +77,17 @@ public class XhpcHistoryOrderController extends BaseController {
*/
@GetMapping("/test3")
@Scheduled(cron = "0 0 12 * * ?")
public void test3() {
public void test3(){
add(100,3);
}
/**
* 场站统计
*/
@GetMapping("/test2")
@Scheduled(cron = "0 0 11 * * ?")
public void test2() {
public void test2(){
add(100,2);
}
}
/**
* 日期统计
@ -99,7 +98,7 @@ public class XhpcHistoryOrderController extends BaseController {
//获取500条待统计历史订单
//跨时段跨费率计费模型
//日期统计
int type = 1;
int type =1;
List<XhpcChargeHistoryOrder> list = xhpcHistoryOrderService.getStatistisList(100,type);
//是否跨天
if(list !=null && list.size()>0){
@ -159,7 +158,7 @@ public class XhpcHistoryOrderController extends BaseController {
}
//修改历史订单表状态
XhpcHistoryOrder xhpcHistoryOrder = new XhpcHistoryOrder();
XhpcHistoryOrder xhpcHistoryOrder =new XhpcHistoryOrder();
xhpcHistoryOrder.setHistoryOrderId(xhpc.getHistoryOrderId());
xhpcHistoryOrder.setState(type + 1);
xhpcHistoryOrderService.update(xhpcHistoryOrder);
@ -169,11 +168,11 @@ public class XhpcHistoryOrderController extends BaseController {
}
/**
* 小时统计,每分钟执行
* 小时统计
*/
@GetMapping("/test")
@Scheduled(cron = "0 * * * * ?")
public void test() {
@Scheduled(cron = "0 */1 * * * ?")
public void test(){
//获取500条待统计历史订单
//跨时段跨费率计费模型
//小时统计

View File

@ -280,7 +280,13 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService {
Map<String, Object> operatorMessage = xhpcChargeOrderService.getOperatorMessage(xhpcChargeOrder.getChargingStationId());
if(operatorMessage !=null){
if(operatorMessage.get("operatorIdEvcs")!=null){
xhpcHistoryOrder.setOperatorIdEvcs(operatorMessage.get("operatorIdEvcs").toString());
if(operatorMessage.get("operatorIdEvcs") !=null && "".equals(operatorMessage.get("operatorIdEvcs").toString())){
String stw = operatorMessage.get("operatorIdEvcs").toString();
if(stw.length()>9){
xhpcHistoryOrder.setOperatorIdEvcs(stw.substring(8, stw.length() - 1));
}
}
}
if(operatorMessage.get("maintenanceCommissionRate") !=null && operatorMessage.get("commissionType") !=null && operatorMessage.get("platformCommissionRate") !=null){
Integer commissionType = (Integer) operatorMessage.get("commissionType");
@ -512,8 +518,8 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService {
xhpcOrderRedisRecord.setCreateTime(date);
xhpcChargeOrderService.addXhpcOrderRedisRecord(xhpcOrderRedisRecord);
//删除redis
redisService.deleteObject("order:"+orderNo);
redisService.deleteObject("order:"+orderNo+".lord");
//redisService.deleteObject("order:"+orderNo);
//redisService.deleteObject("order:"+orderNo+".lord");
logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>");
logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>");
logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>");
@ -629,7 +635,7 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService {
map.put("message", "实时数据");
map.put("userId", xhpcChargeOrder.getUserId());
Map<String, Object> data = new HashMap<>();
data.put("amountCharged",divide);
data.put("amountCharged",amountCharged);
data.put("gunNumber",gunId);
data.put("chargingOrderId",chargeOrderId);
data.put("chargingTimeNumber",cacheRealtimeData.getChargingTime());

View File

@ -4,8 +4,12 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.internal.util.AntCertificationUtil;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeCreateRequest;
import com.alipay.api.response.AlipayTradeCreateResponse;
import com.xhpc.common.api.PowerPileService;
@ -37,10 +41,7 @@ import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.*;
@RestController
@ -91,10 +92,32 @@ public class AlipayPaymentController {
//生成充值订单
XhpcRechargeOrder xhpcRechargeOrder = iXhpcRechargeOrderService.addRechargeOrder(userId, BigDecimal.valueOf(Double.parseDouble(amount)), "2", orderNumber);
String attach = attachYu(StringUtils.valueOf(xhpcRechargeOrder.getRechargeOrderId()), StringUtils.valueOf(amount), null, orderNumber);
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", environment.getProperty("ALIPAYAPPID"), environment.getProperty("ALIPAYPRIVATEKEY"), "json", "utf-8", environment.getProperty("ALIPAYPUBLICKEY"), "RSA2");
/** 初始化 **/
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
/** 支付宝网关 **/
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
/** 应用id如何获取请参考https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID"));
/** 应用私钥, 如何获取请参考https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/
certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY"));
/** 应用公钥证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setCertPath(environment.getProperty("CERTPATH"));
/** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setAlipayPublicCertPath(environment.getProperty("PUBLICCERTPATH"));
/** 支付宝根证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setRootCertPath(environment.getProperty("ROOTCRETPATH"));
/** 设置签名类型 **/
certAlipayRequest.setSignType("RSA2");
/** 设置请求格式固定值json **/
certAlipayRequest.setFormat("json");
/** 设置编码格式 **/
certAlipayRequest.setCharset("UTF-8");
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
//AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", environment.getProperty("ALIPAYAPPID"), environment.getProperty("ALIPAYPRIVATEKEY"), "json", "utf-8", environment.getProperty("ALIPAYPUBLICKEY"), "RSA2");
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
String encode = URLEncoder.encode(attach);
System.out.println("encode :"+encode);
request.setBizContent("{" + "\"out_trade_no\":\""+orderNumber+"\"," +
"\"total_amount\":"+amount+"," +
"\"subject\":\"小华充电\"," +
@ -105,7 +128,7 @@ public class AlipayPaymentController {
request.setNotifyUrl(environment.getProperty("ALIPAYPSERVERDOMAIN"));
try {
//这里和普通的接口调用不同使用的是sdkExecute
AlipayTradeCreateResponse response = alipayClient.execute(request);
AlipayTradeCreateResponse response = alipayClient.certificateExecute(request);
if(response.isSuccess()){
String trade_no = response.getTradeNo();// 获取返回的tradeNO
return AjaxResult.success(trade_no);
@ -132,8 +155,11 @@ public class AlipayPaymentController {
logger.info("<<<<<<<<<<<<params>>>>>>>>>"+params);
logger.info("<<<<<<<<<<<<>>>>>>>>>");
try{
String publiccertpath = getAlipayPublicKey(environment.getProperty("PUBLICCERTPATH"));
logger.info("<<<<<<<<<<<<支付宝公钥证书>>>>>>>>>"+publiccertpath);
// 调用SDK验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(params, environment.getProperty("ALIPAYPUBLICKEY"), "utf-8", "RSA2");
boolean signVerified = AlipaySignature.rsaCheckV1(params, publiccertpath, "utf-8", "RSA2");
logger.info("<<<<<<<<<<<<验证签名>>>>>>>>>"+signVerified);
if (signVerified) {
//("支付宝回调签名认证成功");
AlipayNotifyParam param = buildAlipayNotifyParam(params);
@ -161,14 +187,14 @@ public class AlipayPaymentController {
// 业务处理失败可查看日志进行补偿跟支付宝已经没多大关系
return "success";
}else{
logger.info("<<<<<<<<<<<<支付宝服务器解析失败>>>>>>>>>");
//logger.info("支付宝回调签名认证失败signVerified=false, paramsJson:{}", paramsJson);
return "failure";
}
}catch (Exception e){
e.printStackTrace();
//logger.error("支付宝回调签名认证失败,paramsJson:{},errorMsg:{}", paramsJson, e.getMessage());
return "failure";
}
}
@ -266,4 +292,63 @@ public class AlipayPaymentController {
logger.info("<<<<<<<<<<<<"+r.getMsg()+">>>>>>>>>");
}
public static void main(String[] args) {
try{
// String st ="{gmt_create=2021-10-15 10:14:13, charset=UTF-8, seller_email=27555730@qq.com, subject=小华充电, sign=PNRU8Rck2aTVWqgoVOOsaZFujrlt7AQrsZKWw8S4RP7Ctehgj607PZ0j8364YLuIL9SKY1G7pPAP1Zfgur1uRw5CiqygqBkDl+jVu4Wh1BYUs8Qe0S5rKHGWk27uGi2gGdEvwCoPpzOnfHpGUbz3dhlqb03rkROAHHUNgOeKeMyzU5sfUB6z/tDpXoB3bcqZoEeaBba/mlu7L3QgqAXTRVLaE5tPntZfe5Ag/Sh3M9YX+07ktxA4khvCpRsB84yT3DTAKj8qY/IWnlsf4iUcU0A8GuGRAjkYNwadOIH3N/ngmS9LPkDME+TwoJ8F1gFpx6xbYSSbq8AtoGedujJXpA==, buyer_id=2088912814256712, invoice_amount=2.84, notify_id=2021101500222101424056715726105484, fund_bill_list=[{\"amount\":\"2.16\",\"fundChannel\":\"COUPON\"},{\"amount\":\"2.84\",\"fundChannel\":\"ALIPAYACCOUNT\"}], notify_type=trade_status_sync, trade_status=TRADE_SUCCESS, receipt_amount=5.00, buyer_pay_amount=5.00, app_id=2021002156615717, sign_type=RSA2, seller_id=2088631279527183, gmt_payment=2021-10-15 10:14:23, notify_time=2021-10-15 10:14:24, passback_params=%7B%22customerId%22%3A19%2C%22money%22%3A%225%22%2C%22out_trade_no%22%3A%22000000120211015101411117%22%7D, version=1.0, out_trade_no=000000120211015101411117, total_amount=5.00, trade_no=2021101522001456715750880678, auth_app_id=2021002156615717, buyer_logon_id=181****4652, point_amount=0.00}";
// System.out.println("map:"+st);
// String resultInfo=st.substring(1,st.length()-1);
// //resultInfo=resultInfo.replace(", ","&");
// System.out.println("resultInfo="+resultInfo);
// //回调的待验签字符串
// //String resultInfo = "gmt_create=2021-10-14 18:55:50&charset=UTF-8&seller_email=27555730@qq.com&subject=小华充电&sign=DN7OEd6MwL1d+RsevKOPD9XGGV4hJFZ/gKRuqh2wCIN9FWlutMp654XyTPCu1jOGYaCQkjycJiriq+Cxqp6bXa0bAEKdrl+3bqfE1Cx9YjL5nvgYLuhfhoH7rrFsJVBE92lh7O541f+w8HNrTSG5Xa6lUUuqb55MEHx2GKvAISM9BChSK279FvLQV7rhmhO840QIJCgQkwm6sueLg1tVnH9nkcd0YRrE924n+mYzdRAS6Ekq2MlE2vOjHslO796oIKY0EyHb4z6liSupkmiZgQ2v5DppXiS6+/H6uLyOBMhIgMdO9ZmYRkUtHkq7emYmvjFwR2lRdy/qqnGW3OFbGw==&buyer_id=2088912814256712&invoice_amount=5.00&notify_id=2021101400222185603056715724775024&fund_bill_list=[{\"amount\":\"5.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]&notify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=5.00&buyer_pay_amount=5.00&app_id=2021002156615717&sign_type=RSA2&seller_id=2088631279527183&gmt_payment=2021-10-14 18:56:03&notify_time=2021-10-14 19:10:21&passback_params=%7B%22customerId%22%3A13%2C%22money%22%3A%225%22%2C%22out_trade_no%22%3A%22000000120211014185549114%22%7D&version=1.0&out_trade_no=000000120211014185549114&total_amount=5.00&trade_no=2021101422001456715747823733&auth_app_id=2021002156615717&buyer_logon_id=181****4652&point_amount=0.00";
// String charset="utf-8";
// //支付宝公钥证书
// String alipayPublicCertPath="I:\\顶想\\充电桩\\支付宝\\10-13\\alipayCertPublicKey_RSA2.crt";
// //签名方式
// String sign_type="RSA2";
// //对待签名字符串数据通过&进行拆分
// String [] temp = resultInfo.split(", ");
// LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
// //把拆分数据放在map集合内
// for (int i = 0; i < temp.length; i++) {
// String[] arr = temp[i].split("=", 2); //通过"="号分割成2个数据
// String[] tempAagin = new String[arr.length]; //再开辟一个数组用来接收分割后的数据
// for (int j = 0; j < arr.length; j++) {
// tempAagin[j] = arr[j];
// }
// map.put(tempAagin[0], tempAagin[1]);
// }
// System.out.println("map:"+map);
// //验签方法
// boolean signVerified= AlipaySignature.rsaCertCheckV1(map, alipayPublicCertPath, charset,sign_type);
// if(signVerified){
// // TODO 验签成功后
// System.out.println("验签成功后:success");
// }else{
// System.out.println("验签失败后:fail");
// }
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 从公钥证书中提取公钥
*
* @param alipayPublicCertPath 公钥证书存放路径例如:/home/admin/cert.crt
* @return 公钥
* @throws AlipayApiException
*/
public static String getAlipayPublicKey(String alipayPublicCertPath) throws AlipayApiException {
return AntCertificationUtil.getAlipayPublicKey(alipayPublicCertPath);
}
}

View File

@ -1,8 +1,12 @@
package com.xhpc.payment.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayFundTransUniTransferModel;
import com.alipay.api.domain.Participant;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayFundTransUniTransferRequest;
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
import com.xhpc.common.core.constant.HttpStatus;
@ -39,6 +43,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;
import javax.net.ssl.SSLContext;
import javax.xml.soap.SAAJResult;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@ -77,7 +82,9 @@ public class XhpcRefundAuditController extends BaseController {
@ApiOperation(value = "退款审核")
@Transactional
public AjaxResult info(@RequestBody XhpcRefundAudit xhpcRefundAudit) {
Map<String, Object> map = iXhpcRefundOrderService.info(xhpcRefundAudit.getRefundOrderId());
Long refundOrderId = xhpcRefundAudit.getRefundOrderId();
Map<String, Object> map = iXhpcRefundOrderService.info(refundOrderId);
if (null == map) {
AjaxResult.error(HttpStatus.DATA_ERROR, "退款订单不存在");
@ -109,9 +116,13 @@ public class XhpcRefundAuditController extends BaseController {
xhpcUserAccountStatementService.add(xhpcRefundAudit.getRefundOrderId(), amount, userId, StatusConstants.FLOWING_WATER_REFUND);
String type = StringUtils.valueOf(map.get("type"));
if (StatusConstants.OPERATION_WX_TYPE.equals(type)) {
enterpriseCheckOut(xhpcRefundAudit);
return enterpriseCheckOut(xhpcRefundAudit);
}
if (StatusConstants.OPERATION_ALI_PAY_TYPE.equals(type)) {
return zhbCheckOut(xhpcRefundAudit);
}
}
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.success();
}
@ -166,20 +177,24 @@ public class XhpcRefundAuditController extends BaseController {
*
* @return
*/
public Object enterpriseCheckOut(@RequestBody XhpcRefundAudit xhpcRefundAudit) {
public AjaxResult enterpriseCheckOut(@RequestBody XhpcRefundAudit xhpcRefundAudit) {
//只有审核通过才能退款
Long refundOrderId = xhpcRefundAudit.getRefundOrderId();
Map<String, Object> xhpcRefundOrder = iXhpcRefundOrderService.info(xhpcRefundAudit.getRefundOrderId());
if (StringUtils.isNull(xhpcRefundOrder)) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.DATA_ERROR, "订单不存在");
}
String examineStatus = StringUtils.valueOf(xhpcRefundOrder.get("examineStatus"));
if (!"1".equals(examineStatus)) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款");
}
String status = StringUtils.valueOf(xhpcRefundOrder.get("status"));
if (!"0".equals(status)) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款");
}
@ -200,6 +215,7 @@ public class XhpcRefundAuditController extends BaseController {
Double value = amount * 100;
Integer refund_fee = value.intValue();
if (refund_fee <= 0) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单金额出错");
}
String userId = StringUtils.valueOf(xhpcRefundOrder.get("userId"));
@ -207,10 +223,12 @@ public class XhpcRefundAuditController extends BaseController {
String balance = StringUtils.valueOf(appUserInfo.get("balance"));
if (StringUtils.isNull(appUserInfo)) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.DATA_ERROR, "用户不存在");
}
BigDecimal surplus = BigDecimal.valueOf(Double.valueOf(balance)).subtract(BigDecimal.valueOf(amount));
if (surplus.compareTo(BigDecimal.ZERO) == -1) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.ERROR_STATUS, "余额不足");
}
String result = "";
@ -338,6 +356,7 @@ public class XhpcRefundAuditController extends BaseController {
BigDecimal surplus =new BigDecimal(balance).subtract(amount);
xhpcAppUser.setBalance(surplus);
xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser);
updateXhpcRefundOrder(id,2);
}
return AjaxResult.success("退款成功");
}
@ -345,6 +364,7 @@ public class XhpcRefundAuditController extends BaseController {
AjaxResult.error(e.getMessage());
e.printStackTrace();
}
updateXhpcRefundOrder(id,1);
return AjaxResult.error();
}
@ -353,49 +373,130 @@ public class XhpcRefundAuditController extends BaseController {
* 26 * @throws IOException
* 27
*/
public void enterpriseCheckOut() throws AlipayApiException {
public AjaxResult zhbCheckOut(@RequestBody XhpcRefundAudit xhpcRefundAudit){
//修改订单状态
Long refundOrderId = xhpcRefundAudit.getRefundOrderId();
//只有审核通过才能退款
Map<String, Object> xhpcRefundOrder = iXhpcRefundOrderService.info(xhpcRefundAudit.getRefundOrderId());
String orderNumber = "alipay" + DateUtils.timePath();
if (StringUtils.isNull(xhpcRefundOrder)) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.DATA_ERROR, "订单不存在");
}
String examineStatus = StringUtils.valueOf(xhpcRefundOrder.get("examineStatus"));
if (!"1".equals(examineStatus)) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款");
}
String status = StringUtils.valueOf(xhpcRefundOrder.get("status"));
if (!"0".equals(status)) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款");
}
String orderOutNumber = StringUtils.valueOf(xhpcRefundOrder.get("refundOrderNumber"));
String uid = StringUtils.valueOf(xhpcRefundOrder.get("alipayId"));
String money = StringUtils.valueOf(xhpcRefundOrder.get("amount"));
Double amount = Double.parseDouble(StringUtils.valueOf(xhpcRefundOrder.get("amount")));
//退款金额单位为分
Double value = amount * 100;
Integer refund_fee = value.intValue();
if (refund_fee <= 0) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单金额出错");
}
String userId = StringUtils.valueOf(xhpcRefundOrder.get("userId"));
Map<String, Object> appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(Long.parseLong(userId));
String balance = StringUtils.valueOf(appUserInfo.get("balance"));
String filePath = this.getClass().getResource("/").getPath() + "证书名字";
System.out.println(filePath);
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID"));
certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY"));//密钥
certAlipayRequest.setFormat("json");
certAlipayRequest.setCharset("UTF-8");
certAlipayRequest.setSignType("RSA2");
certAlipayRequest.setCertPath(filePath + "appCertPublicKey.crt");//应用证书
certAlipayRequest.setAlipayPublicCertPath(filePath + "alipayCertPublicKey_RSA2.crt");//支付证书
certAlipayRequest.setRootCertPath(filePath + "alipayRootCert.crt");
DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
//价格
Double money = 0.01;
//转账标题
String order_title = "支付宝提现";
//支付宝会员id
String identity = "123";
//实名信息
String name = "";
request.setBizContent("{" +
"\"out_biz_no\":\"201806300001\"," +
if (StringUtils.isNull(appUserInfo)) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.DATA_ERROR, "用户不存在");
}
BigDecimal surplus = BigDecimal.valueOf(Double.valueOf(balance)).subtract(BigDecimal.valueOf(amount));
if (surplus.compareTo(BigDecimal.ZERO) == -1) {
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error(HttpStatus.ERROR_STATUS, "余额不足");
}
try {
String orderNumber = "alipay" + DateUtils.timePath();
/** 初始化 **/
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
/** 支付宝网关 **/
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
/** 应用id如何获取请参考https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID"));
/** 应用私钥, 如何获取请参考https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/
certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY"));
/** 应用公钥证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setCertPath(environment.getProperty("CERTPATH"));
/** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setAlipayPublicCertPath(environment.getProperty("PUBLICCERTPATH"));
/** 支付宝根证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setRootCertPath(environment.getProperty("ROOTCRETPATH"));
/** 设置签名类型 **/
certAlipayRequest.setSignType("RSA2");
/** 设置请求格式固定值json **/
certAlipayRequest.setFormat("json");
/** 设置编码格式 **/
certAlipayRequest.setCharset("UTF-8");
"\"trans_amount\":" + money + "," +
"\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
"\"biz_scene\":\"DIRECT_TRANSFER\"," +
"\"order_title\":\"" + order_title + "\"," +
"\"payee_info\":{" +
"\"identity\":\"" + identity + "\"," +
"\"identity_type\":\"ALIPAY_USER_ID \"," +
" }," +
" }");
AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
/** 实例化具体API对应的request类类名称和接口名称对应,当前调用接口名称alipay.fund.trans.uni.transfer(单笔转账接口) **/
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
/** 设置业务参数具体接口参数传值以文档说明为准https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer/ **/
AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
/** 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一 **/
model.setOutBizNo(orderNumber);
/** 转账金额TRANS_ACCOUNT_NO_PWD产品取值最低0.1 **/
model.setTransAmount(money);
/** 产品码单笔无密转账到支付宝账户固定为TRANS_ACCOUNT_NO_PWD **/
model.setProductCode("TRANS_ACCOUNT_NO_PWD");
/** 场景码单笔无密转账到支付宝账户固定为DIRECT_TRANSFER **/
model.setBizScene("DIRECT_TRANSFER");
/** 转账业务的标题,用于在支付宝用户的账单里显示 **/
model.setOrderTitle("转账标题");
Participant participant = new Participant();
/** 参与方的唯一标识,收款支付宝账号或者支付宝吧账号唯一会员ID **/
participant.setIdentity(uid);
/** 参与方的标识类型ALIPAY_USER_ID 支付宝的会员ID **/
participant.setIdentityType("ALIPAY_USER_ID");
model.setPayeeInfo(participant);
/** 业务备注 **/
model.setRemark("单笔转账--"+orderOutNumber);
request.setBizModel(model);
AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
/** 获取接口调用结果如果调用失败可根据返回错误信息到该文档寻找排查方案https://opensupport.alipay.com/support/helpcenter/107 **/
if (response.isSuccess()) {
System.out.println("调用成功");
Map<String, Object> appUserInfo1 = xhpcUserAccountStatementMapper.appUserInfo(Long.parseLong(userId));
//退款成功修改订单
if (StringUtils.isNotNull(appUserInfo1)) {
String balance1 = StringUtils.valueOf(appUserInfo1.get("balance"));
//减少用户余额
XhpcAppUser xhpcAppUser = new XhpcAppUser();
xhpcAppUser.setAppUserId(Long.parseLong(userId));
BigDecimal surplus1 =new BigDecimal(balance1).subtract(BigDecimal.valueOf(amount));
xhpcAppUser.setBalance(surplus1);
xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser);
updateXhpcRefundOrder(refundOrderId,1);
}
return AjaxResult.success("退款成功");
} else {
System.out.println("调用失败");
}
}catch (Exception e){
e.printStackTrace();
}
updateXhpcRefundOrder(refundOrderId,2);
return AjaxResult.error("退款失败");
}
public void updateXhpcRefundOrder(Long refundOrderId,Integer status){
XhpcRefundOrder refundOrder =new XhpcRefundOrder();
refundOrder.setRefundOrderId(refundOrderId);
refundOrder.setStatus(status);
iXhpcRefundOrderService.update(refundOrder);
}
}

View File

@ -42,7 +42,10 @@ public class XhpcRefundAuditServiceImpl implements IXhpcRefundAuditService {
XhpcRefundOrder xhpcRefundOrder = new XhpcRefundOrder();
xhpcRefundOrder.setRefundOrderId(xhpcRefundAudit.getRefundOrderId());
xhpcRefundOrder.setExamineStatus(xhpcRefundAudit.getStatus());
xhpcRefundOrder.setStatus(StatusConstants.REFUND_ORDER_STATUS_WAIT);
int updateStatus = xhpcRefundOrderMapper.updateExamineStatus(xhpcRefundOrder);
if (updateStatus == 0) {
return AjaxResult.error();

View File

@ -23,6 +23,10 @@ spring:
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
logging:
level:
com.xhpc.order.mapper: debug
##获取微信openid地址
WXGETJSCODE: "https://api.weixin.qq.com/sns/jscode2session?appid=wxb14ef93e9b7901f3&secret=b5c5672141b5930c30a1abee95a2dcbf&js_code="
##阿里云身份证验证地址
@ -45,8 +49,14 @@ WXTRANSFERS: "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfer
#支付宝支付回调地址
ALIPAYPSERVERDOMAIN: "https://www.scxhua.cn/prod-api/xhpc-payment/alipay/notifyUrl"
#支付宝公钥
ALIPAYPUBLICKEY: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjHDksTgZTpf0wh7oeTVRp0h3SqzTM2smjEJnx9jF1+q3WSXLRB4OzSzq7VsJ/szcyK10ZGO5PxeQ4u9GAG/U+7xhs7ei1cJB/Er55Sg9SbjfkTpwlDv181UJCRJJ/IAcqyqezwTpB8e2trYmHKovUdt0KR9/tVkGa7hsNd5GfxTOUaAFc3zADqRVM+wGimtG0NYfOF2f8tkmBEAiMMLKq5pbAnHU723a1cm/nfVp7gvXfsnO0k2GvRuHzb8mxIhWLiAnwdK9gEu5za/jWxo/xIvf2sdJPYdWj+yfyzA2e1fJkx4uRUzX31CXxZvP2/tfEcnTdI0gxN+OH2eAMiPVswIDAQAB"
ALIPAYPUBLICKEY:
#应用私钥
ALIPAYPRIVATEKEY: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC6goPD1M6MqF31hS9+hnzXDvILjaw2AFLhgbXUp4UD+8N1pvx7PkzMzPj9OWLBl0GZyDOwSJnboan4Gw/DGwekHVcgnGJWmlojquqE9ZB0Nu69AkhIs9KnHsYe5QnjLSwa7e+InoRKqB4/XscQ4GnKG8Wpq8UH9O9lqgKdnY9+ShcsEJkY88AzmlMIQtluXlweXfEUnfPVxOCZwX0yEaLYdoJMLgcp6QD+IBpJ049vpPFzzsCzp4j7agInzPlNkG+euOEkC+EWMmLd6P0hXN4OJ4dNSo8IwUcV1cbXHL8FmtnavWnk0pykNZYqeKQdCh+JdhU50t/dmXhuM1ejEe5RAgMBAAECggEAZRo230NOrETgmiUWd9njdpjtcIHd5nAKfZ/Yt2wP2PbzH6Xjm9NLwoEiP/KJrDOYJgq2qkrQzJQ4FPxmcPcID1iwUEc1r4iAcHFIK8cKBVV52Q+Rq4d/G4S9FSZHU9S64eY1QLPdNrMnomZ4NpfQAPVJEw7AAe4uj8e3H0W38Va+4QBVYgov1UAJxbsE9jue8NeBMoLRCol/lu/lXH2ndYK4EpCgiK7xNdg8SuIt5hIoYqmQ3Pbd6Fn64AL8cZqiLiFjVoMTBfYbuv99UwyYrm12WAqJ4fAnzwJvozYbBvZPqZYeor8L0Qv1RJUy0KDnWciRgSJQ+Vo3kXlLH7DK2QKBgQDrqUNZnAL0V+RttCkwF2m0GXgplZXVfC1dIXxNsrJaEQ/4/Q3mYI52cMFOd7T09PCGXw4MU9b90srzPTbxSzUCXUfGeNimr+Ivhz5sDiVkJEv5DdowJaos0/yH4kSBFGPN8DOiDoGBBfAUBojZl0gS3eHMGmjwkXGkWZ3O3WE43wKBgQDKm0sa5LIP1/bfP5JmanNuGBOjTsBhApGEavjBtEzSqhIkj2IrlglQ6b2ckfubAsDhoMtYE32gDBnPiFOAlwmrTuB72XWoAnzdkJupklEH1dafBuT20JIRQXjeTD2kl1Ffa3+IN2miDXJ4slaNiEDYo1YPUYLaL7Kfoy84JP9OzwKBgEjWaBqqPb+H6vJ9XL2gfutLc/hmY4k4eEzwrJrXQIjV/TnX/RPXhDDXaOf319ZeXnkpqA3nW+vX2yKTKQgrVpcEfcq6Tzw14JMQGhsLxELPdSvlPCrleVOhscvOA55hzvc35r2P/jcCvtFxs5qNR5mNOtz6zLSOP7GsgToO8p3BAoGBAKzk9KSQgHsQurUsVMxdDv/mP+veakDepjsv5fO23s/vHehhC09Si8Smko4n7WQMZ3ijdKNGjq+jY+s71LYpLbEocFx/5+1lohSZMJz2JXvgOXQfuAf/WIatLm3U9c2c623YGE6vqs8FVqg017OTkHLOf8Q2tMloZq/f24231L71AoGALwpnQdJG11G/IVb5D8YA1LbASOztW1M5RX9YeVkqISIOFzM+872PUgUq04Qa0QB+P+BOo3TS58o+Q8R6ErTiYF84X2z6nX0dgDzIB3pV6t+VQFCBO5PtsYaSgJQ4H3i5y9i2e5Zt34s9dZ5rdm2BD/RoGijVM9U+ccrNId4wWRE="
ALIPAYPRIVATEKEY: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCGHX1s315EKjoIBkNiF3IxCAmvtVg+TdCDL/XmJZWdcZ23tEWmmIMsLRCLUKsaPfTEhnqD6EFJnmpJu4teDImo3aDbOoO31YFEXjMXUnTTS/dtDVEo1OecsRL+Re43KSohOkIL1TMyTuNfeIglQTuhCSZ3LOEOx4OHpYwcrLp8p1ORvAS7x35nsmjLp3oQTJo9RWfzfEaKbm6cxsWLKyr5/5eGDXrUHNC5hIDLjoJbe6iqNKyIiPJHtPZfJ36PcWa7PFvx4X+Ded32KZb2AA3p9w/HX7gn1MnRfT5NGH0k3ggxLNarDU8g6JjQYgNtmE/R8gbp99BudZNfDoSF1llNAgMBAAECggEAaTa9bSoXM/bErALt3ghyx1B8+OGVpts5F5IKoVEe/PNjPfkpIzdGwONhtUnF0cKFQaAWgWE1xuGGlO2Sumevn1Cvnw1axF+1F8Om5UcE67cPFvh5kUTlpyGrutt1tMSQjpy7r7jEf1UwP3e5pzBz7TPWf2wv635OC56uOtivPJZ+8vg7VYon/mNXQuL4AavoxfSDtvo0ad30X2fK1WKeeBtgiT4UzV6ZGZh5igKQHM4lVvmbo/jOeQD0KAod7pRe/h4FBFmCVIWwgW+I+Hnzp8A/nJezoowJ3jiTt0FodC9uBCT64ZCz5dVCryD62LDVjKBxB7cfIoQA+PxCiXr9QQKBgQD+2v38J/MlfK/XCYldclzumizwIw6T0Mv6XvYwXQHYgYDKYNF6k1LhMEUo7fP3EsPdV8h/nXmdU4qadOVm6QSJ/rGEl22yGlO7woUzTY/Ls9eknoqfMYuyI1+ICMnNxmesQbWyc0cOHh44cEF+icfJxEDAmrHGLmBVsKuLUJUuVQKBgQCGt663TF7mixghiUOcT11zC1fqG+dIcvAwHpCHfdxsniYRqnv+SLf6eC5PCkQ5aNAAl/ywOLQAWS0XgYti3LyZ4iuGIYcUE0IDDmhWl68V27iXcLIK+rBRqBGxSdk8xR+zSE8fpO4mXpxn8SH0Butex8PJ+oHTbmdXIUAXdn6HGQKBgQCvAB1rqtsRoL72ADxtCHy78u5srwXxhmyqrc6LgzIjQzn2vejaLJO6wfSbmFnwDNimAwNQbgf2ekkwqphjxBozz8qB66GNrPpWccoZYmcdT48CIUO68MCmQBf3R2GbhWPnKu/ja7kc/p1tz9eJVn70E2kLWK4+EdZgwQHqlhj6SQKBgF4AmbdpYOb5s9Li1vyhHJIEHkpLQi15lkPdb/g7SK26BNJa5b5fu5DYf2fDwCtXCZ0AcN/+EQwVLbOzPzGy2R9/g+NKTdkiPvOnAAM8QH2+HaX+ix3CI3o3DnFpGF6hJieRkzR/f3Ximryks451rZMrTWEIncKMzSstFm3Izy0xAoGBAJQaMqlzpM+QaJiytJNeqRpPWRsi0Dkf4XqJXPWLOrApSISsafZF5vk2ZOeIqRsVCBH3LdfVIJxEBAF4l/Sd2q7xC9JHawJDqa4ea7VwL68ANH2w3jcJ3j6DQqf7NIe/lSGxYF6Jt+74oRFHxN3GDSf+z91DYfZz8hQnyphKDNEJ"
#支付宝appid
ALIPAYAPPID: "2021002156615717"
#应用公钥证书路径
CERTPATH: "/www/wwwroot/scxhua.cn/xhpc-payment/appCertPublicKey.crt"
#支付宝公钥证书路径
PUBLICCERTPATH: "/www/wwwroot/scxhua.cn/xhpc-payment/alipayCertPublicKey_RSA2.crt"
#支付宝根证书路径
ROOTCRETPATH: "/www/wwwroot/scxhua.cn/xhpc-payment/alipayRootCert.crt"

View File

@ -2,7 +2,9 @@ package com.xhpc.user.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
@ -20,6 +22,12 @@ import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
@ -219,11 +227,36 @@ public class XhpcAppUserController extends BaseController {
@ApiOperation("支付宝授权")
@PostMapping("/alipayEmpower")
public AjaxResult alipayEmpower(@RequestParam String code) throws Exception {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", environment.getProperty("ALIPAYAPPID"), environment.getProperty("ALIPAYPRIVATEKEY"), "json", "utf-8", environment.getProperty("ALIPAYPUBLICKEY"), "RSA2");
/** 初始化 **/
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
/** 支付宝网关 **/
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
/** 应用id如何获取请参考https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID"));
/** 应用私钥, 如何获取请参考https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/
certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY"));
/** 应用公钥证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setCertPath(environment.getProperty("CERTPATH"));
/** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setAlipayPublicCertPath(environment.getProperty("PUBLICCERTPATH"));
/** 支付宝根证书路径,下载后保存位置的绝对路径 **/
certAlipayRequest.setRootCertPath(environment.getProperty("ROOTCRETPATH"));
/** 设置签名类型 **/
certAlipayRequest.setSignType("RSA2");
/** 设置请求格式固定值json **/
certAlipayRequest.setFormat("json");
/** 设置编码格式 **/
certAlipayRequest.setCharset("UTF-8");
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");
// auth_code 前端授权后得到的授权码
request.setCode(code);
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
AlipaySystemOauthTokenResponse response = alipayClient.certificateExecute(request);
//服务端请求返回RSA2密钥和公钥证书请求方式不同如当面付
// RSA2密钥请求response = alipayClient.execute(request);
// 公钥证书请求请求response = alipayClient.certificateExecute(request);
if (response.isSuccess()) {
System.out.println("调用成功");
} else {
@ -242,4 +275,15 @@ public class XhpcAppUserController extends BaseController {
return iXhpcAppUserUserService.logout(phone, code);
}
public static void main(String[] args) {
try {
}catch (Exception e){
e.printStackTrace();
}
}
}

View File

@ -26,8 +26,14 @@ spring:
#获取微信openid地址
WXGETJSCODE: "https://api.weixin.qq.com/sns/jscode2session?appid=wxd0a48e00319ef8a7&secret=e26d9088b58e24af69411d5933cece47&js_code="
#支付宝公钥
ALIPAYPUBLICKEY: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjHDksTgZTpf0wh7oeTVRp0h3SqzTM2smjEJnx9jF1+q3WSXLRB4OzSzq7VsJ/szcyK10ZGO5PxeQ4u9GAG/U+7xhs7ei1cJB/Er55Sg9SbjfkTpwlDv181UJCRJJ/IAcqyqezwTpB8e2trYmHKovUdt0KR9/tVkGa7hsNd5GfxTOUaAFc3zADqRVM+wGimtG0NYfOF2f8tkmBEAiMMLKq5pbAnHU723a1cm/nfVp7gvXfsnO0k2GvRuHzb8mxIhWLiAnwdK9gEu5za/jWxo/xIvf2sdJPYdWj+yfyzA2e1fJkx4uRUzX31CXxZvP2/tfEcnTdI0gxN+OH2eAMiPVswIDAQAB"
ALIPAYPUBLICKEY:
#应用私钥
ALIPAYPRIVATEKEY: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC6goPD1M6MqF31hS9+hnzXDvILjaw2AFLhgbXUp4UD+8N1pvx7PkzMzPj9OWLBl0GZyDOwSJnboan4Gw/DGwekHVcgnGJWmlojquqE9ZB0Nu69AkhIs9KnHsYe5QnjLSwa7e+InoRKqB4/XscQ4GnKG8Wpq8UH9O9lqgKdnY9+ShcsEJkY88AzmlMIQtluXlweXfEUnfPVxOCZwX0yEaLYdoJMLgcp6QD+IBpJ049vpPFzzsCzp4j7agInzPlNkG+euOEkC+EWMmLd6P0hXN4OJ4dNSo8IwUcV1cbXHL8FmtnavWnk0pykNZYqeKQdCh+JdhU50t/dmXhuM1ejEe5RAgMBAAECggEAZRo230NOrETgmiUWd9njdpjtcIHd5nAKfZ/Yt2wP2PbzH6Xjm9NLwoEiP/KJrDOYJgq2qkrQzJQ4FPxmcPcID1iwUEc1r4iAcHFIK8cKBVV52Q+Rq4d/G4S9FSZHU9S64eY1QLPdNrMnomZ4NpfQAPVJEw7AAe4uj8e3H0W38Va+4QBVYgov1UAJxbsE9jue8NeBMoLRCol/lu/lXH2ndYK4EpCgiK7xNdg8SuIt5hIoYqmQ3Pbd6Fn64AL8cZqiLiFjVoMTBfYbuv99UwyYrm12WAqJ4fAnzwJvozYbBvZPqZYeor8L0Qv1RJUy0KDnWciRgSJQ+Vo3kXlLH7DK2QKBgQDrqUNZnAL0V+RttCkwF2m0GXgplZXVfC1dIXxNsrJaEQ/4/Q3mYI52cMFOd7T09PCGXw4MU9b90srzPTbxSzUCXUfGeNimr+Ivhz5sDiVkJEv5DdowJaos0/yH4kSBFGPN8DOiDoGBBfAUBojZl0gS3eHMGmjwkXGkWZ3O3WE43wKBgQDKm0sa5LIP1/bfP5JmanNuGBOjTsBhApGEavjBtEzSqhIkj2IrlglQ6b2ckfubAsDhoMtYE32gDBnPiFOAlwmrTuB72XWoAnzdkJupklEH1dafBuT20JIRQXjeTD2kl1Ffa3+IN2miDXJ4slaNiEDYo1YPUYLaL7Kfoy84JP9OzwKBgEjWaBqqPb+H6vJ9XL2gfutLc/hmY4k4eEzwrJrXQIjV/TnX/RPXhDDXaOf319ZeXnkpqA3nW+vX2yKTKQgrVpcEfcq6Tzw14JMQGhsLxELPdSvlPCrleVOhscvOA55hzvc35r2P/jcCvtFxs5qNR5mNOtz6zLSOP7GsgToO8p3BAoGBAKzk9KSQgHsQurUsVMxdDv/mP+veakDepjsv5fO23s/vHehhC09Si8Smko4n7WQMZ3ijdKNGjq+jY+s71LYpLbEocFx/5+1lohSZMJz2JXvgOXQfuAf/WIatLm3U9c2c623YGE6vqs8FVqg017OTkHLOf8Q2tMloZq/f24231L71AoGALwpnQdJG11G/IVb5D8YA1LbASOztW1M5RX9YeVkqISIOFzM+872PUgUq04Qa0QB+P+BOo3TS58o+Q8R6ErTiYF84X2z6nX0dgDzIB3pV6t+VQFCBO5PtsYaSgJQ4H3i5y9i2e5Zt34s9dZ5rdm2BD/RoGijVM9U+ccrNId4wWRE="
ALIPAYPRIVATEKEY: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCGHX1s315EKjoIBkNiF3IxCAmvtVg+TdCDL/XmJZWdcZ23tEWmmIMsLRCLUKsaPfTEhnqD6EFJnmpJu4teDImo3aDbOoO31YFEXjMXUnTTS/dtDVEo1OecsRL+Re43KSohOkIL1TMyTuNfeIglQTuhCSZ3LOEOx4OHpYwcrLp8p1ORvAS7x35nsmjLp3oQTJo9RWfzfEaKbm6cxsWLKyr5/5eGDXrUHNC5hIDLjoJbe6iqNKyIiPJHtPZfJ36PcWa7PFvx4X+Ded32KZb2AA3p9w/HX7gn1MnRfT5NGH0k3ggxLNarDU8g6JjQYgNtmE/R8gbp99BudZNfDoSF1llNAgMBAAECggEAaTa9bSoXM/bErALt3ghyx1B8+OGVpts5F5IKoVEe/PNjPfkpIzdGwONhtUnF0cKFQaAWgWE1xuGGlO2Sumevn1Cvnw1axF+1F8Om5UcE67cPFvh5kUTlpyGrutt1tMSQjpy7r7jEf1UwP3e5pzBz7TPWf2wv635OC56uOtivPJZ+8vg7VYon/mNXQuL4AavoxfSDtvo0ad30X2fK1WKeeBtgiT4UzV6ZGZh5igKQHM4lVvmbo/jOeQD0KAod7pRe/h4FBFmCVIWwgW+I+Hnzp8A/nJezoowJ3jiTt0FodC9uBCT64ZCz5dVCryD62LDVjKBxB7cfIoQA+PxCiXr9QQKBgQD+2v38J/MlfK/XCYldclzumizwIw6T0Mv6XvYwXQHYgYDKYNF6k1LhMEUo7fP3EsPdV8h/nXmdU4qadOVm6QSJ/rGEl22yGlO7woUzTY/Ls9eknoqfMYuyI1+ICMnNxmesQbWyc0cOHh44cEF+icfJxEDAmrHGLmBVsKuLUJUuVQKBgQCGt663TF7mixghiUOcT11zC1fqG+dIcvAwHpCHfdxsniYRqnv+SLf6eC5PCkQ5aNAAl/ywOLQAWS0XgYti3LyZ4iuGIYcUE0IDDmhWl68V27iXcLIK+rBRqBGxSdk8xR+zSE8fpO4mXpxn8SH0Butex8PJ+oHTbmdXIUAXdn6HGQKBgQCvAB1rqtsRoL72ADxtCHy78u5srwXxhmyqrc6LgzIjQzn2vejaLJO6wfSbmFnwDNimAwNQbgf2ekkwqphjxBozz8qB66GNrPpWccoZYmcdT48CIUO68MCmQBf3R2GbhWPnKu/ja7kc/p1tz9eJVn70E2kLWK4+EdZgwQHqlhj6SQKBgF4AmbdpYOb5s9Li1vyhHJIEHkpLQi15lkPdb/g7SK26BNJa5b5fu5DYf2fDwCtXCZ0AcN/+EQwVLbOzPzGy2R9/g+NKTdkiPvOnAAM8QH2+HaX+ix3CI3o3DnFpGF6hJieRkzR/f3Ximryks451rZMrTWEIncKMzSstFm3Izy0xAoGBAJQaMqlzpM+QaJiytJNeqRpPWRsi0Dkf4XqJXPWLOrApSISsafZF5vk2ZOeIqRsVCBH3LdfVIJxEBAF4l/Sd2q7xC9JHawJDqa4ea7VwL68ANH2w3jcJ3j6DQqf7NIe/lSGxYF6Jt+74oRFHxN3GDSf+z91DYfZz8hQnyphKDNEJ"
#支付宝appid
ALIPAYAPPID: "2021002156615717"
#应用公钥证书路径
CERTPATH: "/www/wwwroot/scxhua.cn/xhpc-user/appCertPublicKey.crt"
#支付宝公钥证书路径
PUBLICCERTPATH: "/www/wwwroot/scxhua.cn/xhpc-user/alipayCertPublicKey_RSA2.crt"
#支付宝根证书路径
ROOTCRETPATH: "/www/wwwroot/scxhua.cn/xhpc-user/alipayRootCert.crt"