package com.platform.yijia.controller;
import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import com.platform.yijia.config.YiJiaRequest;
import com.platform.yijia.param.request.PayInfoRequest;
import com.platform.yijia.pojo.PayOrder;
import com.platform.yijia.service.*;
import com.platform.yijia.utils.CodeMsg;
import com.platform.yijia.utils.ResultData;
import com.platform.yijia.utils.weixinapp.WxPushUtil;
import com.saobei.open.sdk.DefaultSaobeiApiClient;
import com.saobei.open.sdk.SaobeiApiClient;
import com.saobei.open.sdk.model.requst.trade.SaobeiJsPayRequest;
import com.saobei.open.sdk.model.requst.trade.SaobeiMiniPayRequest;
import com.saobei.open.sdk.model.requst.trade.preauth.SaobeiPreAuthMiniPayRequest;
import com.saobei.open.sdk.model.response.trade.SaobeiJsPayResponse;
import com.saobei.open.sdk.model.response.trade.SaobeiMiniPayResponse;
import com.saobei.open.sdk.model.response.trade.preauth.SaobeiPreAuthMiniPayResponse;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Random;
/*
*
SaoBeiPayController
* 第三方扫呗支付
* @Author JK
* @Date 2021年8月18日
*/
@Controller
@YiJiaRequest()
@CrossOrigin
public class SaoBeiPayController {
private static Logger logger =(Logger) LoggerFactory.getLogger(SaoBeiPayController.class);
@Resource
private PayOrderService payOrderService;
@Resource
private AppUserInfoService appUserInfoService;
@Resource
private StationOilGunService stationOilGunService;
@Resource
private CustomerGradeServices customerGradeServices;
@Resource
private StationService stationService;
@Resource
private CustomerPointsService customerPointsService;
@Resource
private IntegralRuleService integralRuleService;
@Resource
private CustomerPointsRecordService customerPointsRecordService;
@Resource
private WxPushUtil wxPushUtil;
@Resource
private GzhNewsTemplateService gzhNewsTemplateService;
@Resource
private CustomerManagerService customerManagerService;
@Value("${yijia.path.global-prefix}")
private String globalPrefix;
@Value("${yijia.domainName}")
private String domainName;
// 商户号:852107011000070
// 终端号:33336510
// 密钥(token):dbea558077934b95a2f2adf57d278c40
//测试
// 商户号码:852105942000011
// 终端号:18237172
// 密钥:2ef428f4f76c414282e831baea9e4b0e
//智慧易加
// 商户号码:845104816000034
// 终端号:18241101
// 密钥:23570b46a955484d92038f6a18d2b9d6
// public static final String PAY_VER = "110"; //版本号
// public static final String KEY = ""; //机构秘钥
// public static final String ACCESS_TOKEN = "2ef428f4f76c414282e831baea9e4b0e"; //支付秘钥
// public static final String INST_NO = ""; //机构号
// public static final String MERCHANT_NO = "852105942000011"; //商户号
// public static final String TERMINAL_ID = "18237172"; //终端号
/***
* 公众号云闪付拉起支付
* @param payInfoRequest
* @return
* @throws Exception
*/
@RequestMapping(value = {"/yunPayGzh"}, consumes = {"application/json"}, method = {RequestMethod.POST})
@ResponseBody
public String yunPayGzh(@RequestBody PayInfoRequest payInfoRequest) throws Exception {
//智慧易加
// 商户号码:845104816000034
// 终端号:18241101
// 密钥:23570b46a955484d92038f6a18d2b9d6
Gson gson = new Gson();
ResultData resultData = null;
//根据订单号查询订单信息
String ordNo = payInfoRequest.getOrdNo();
PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
if(payOrder !=null){
if(payOrder.getStatus().equals("0")){
//String stationId = payInfoRequest.getStationId();
Map staPayChannelInfo = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
if(staPayChannelInfo !=null && staPayChannelInfo.containsKey("merchantNo") && staPayChannelInfo.containsKey("terminalId")
&& staPayChannelInfo.containsKey("yunKey") && staPayChannelInfo.containsKey("gzhAppId")){
//创建client
SaobeiApiClient client = new DefaultSaobeiApiClient<>(staPayChannelInfo.get("yunKey"));
//创建requst
SaobeiJsPayRequest requst = new SaobeiJsPayRequest();
requst.setPay_ver("110");
requst.setPay_type("010");
requst.setService_id("012");
requst.setMerchant_no(staPayChannelInfo.get("merchantNo")); //商户号
requst.setTerminal_id(staPayChannelInfo.get("terminalId")); //终端号
requst.setTerminal_trace(payOrder.getOrderNo()); //订单号
requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()));
//云闪付金额单位为分
BigDecimal totalFee = new BigDecimal(payOrder.getAmt().toString()).multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_DOWN);
logger.info("该订单金额:" + payOrder.getAmt().toString()+"; 拉起云闪付上送金额(单位:分):" + totalFee.toString());
requst.setTotal_fee(totalFee.toString());
requst.setSub_appid(staPayChannelInfo.get("gzhAppId"));
requst.setOpen_id(payInfoRequest.getOpenId()); //oJR5R6r4EJhaORFcPap70r_mtFZo //oRwjv4iHjSUgxNxOJOQ_60Ln7cno
String orderBody = payOrder.getOilName() + " - " +payOrder.getStationName();
requst.setOrder_body(orderBody);
String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayGzhCallback";
//logger.info("回调地址:"+ notifyUrl);
requst.setNotify_url(notifyUrl);
//发送请求
System.out.println("请求报文:"+JSON.toJSONString(requst));
SaobeiJsPayResponse response = client.execute(requst);
System.out.println("返回报文:"+JSON.toJSONString(response));
resultData = ResultData.success(response);
}else {
resultData = ResultData.error(CodeMsg.STATION_NULL_INFO);
}
}else {
resultData = ResultData.error(CodeMsg.ALREADY_PAY);
}
}else {
resultData = ResultData.error(CodeMsg.NO_ORDER);
}
return gson.toJson(resultData);
}
/***
* 公众号扫呗支付回调
* @param jsonObject
* @return
*/
@RequestMapping(value = "/getYunPayGzhCallback", consumes = "application/json", method = RequestMethod.POST)
@ResponseBody
@Transactional
public JSONObject getYunPayGzhCallback(@RequestBody JSONObject jsonObject){
JSONObject result = new JSONObject(); //返回给扫呗状态码
System.out.println("扫呗调用回调接口返回参数:" + jsonObject);
if(jsonObject.containsKey("result_code") && jsonObject.get("result_code").toString().equals("01")){
//业务逻辑
//返给扫呗状态码
result.put("return_code", "01");
result.put("return_msg", "success");
}else {
result.put("return_code", "02");
result.put("return_msg", "fail");
}
return result;
}
/***
* 小程序云闪付拉起支付
* @param payInfoRequest
* @return
* @throws Exception
*/
@RequestMapping(value = {"/yunPay"}, consumes = {"application/json"}, method = {RequestMethod.POST})
@ResponseBody
public String yunPay(@RequestBody PayInfoRequest payInfoRequest) throws Exception {
// 智慧易加
// 商户号码:845104816000034
// 终端号:18241101
// 密钥:23570b46a955484d92038f6a18d2b9d6
Gson gson = new Gson();
ResultData resultData = null;
//根据订单号查询订单信息
String ordNo = payInfoRequest.getOrdNo();
PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
if(payOrder !=null){
if(payOrder.getStatus().equals("0")) {
//String stationId = payInfoRequest.getStationId();
Map staPayChannelInfo = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
if(staPayChannelInfo !=null && staPayChannelInfo.containsKey("merchantNo") && staPayChannelInfo.containsKey("terminalId")
&& staPayChannelInfo.containsKey("yunKey") && staPayChannelInfo.containsKey("appId")) {
//秘钥
String yunKey = staPayChannelInfo.get("yunKey"); //23570b46a955484d92038f6a18d2b9d6
DefaultSaobeiApiClient defaultSaobeiApiClient = new DefaultSaobeiApiClient(yunKey); //2ef428f4f76c414282e831baea9e4b0e
SaobeiMiniPayRequest requst = new SaobeiMiniPayRequest();
requst.setPay_ver("100");
requst.setPay_type("010");
requst.setService_id("015");
requst.setMerchant_no(staPayChannelInfo.get("merchantNo")); //商户号 845104816000034
requst.setTerminal_id(staPayChannelInfo.get("terminalId")); //终端号 18241101
requst.setTerminal_trace(payOrder.getOrderNo()); //订单号 202003252204310000 6683315853083916109905
requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date())); //"20200325220431"
//云闪付单位为分
BigDecimal totalFee = new BigDecimal(payOrder.getAmt().toString()).multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_DOWN);
logger.info("该订单金额:" + payOrder.getAmt().toString()+"; 拉起云闪付上送金额(单位:分):" + totalFee.toString());
requst.setTotal_fee(totalFee.toString());
String openId = payInfoRequest.getOpenId();
requst.setOpen_id(openId); // oRwjv4iHjSUgxNxOJOQ_60Ln7cno obnG9jhDLvom5fGwuhYysmQTW4qQ
//订单内容
String orderBody = payOrder.getOilName()+ " - " + payOrder.getOilGun() + "号枪 - " +payOrder.getStationName();
requst.setOrder_body(orderBody);
//回调地址
String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayCallback";
logger.info("回调地址:" + notifyUrl);
requst.setNotify_url(notifyUrl);
//小程序appId
requst.setSub_appid(staPayChannelInfo.get("appId")); // wxe1135cd390b38a54 wxe568c727d466aef9 智慧易加公众号:wxc8189d3b3a7283e0
System.out.println("请求报文:" + JSON.toJSONString(requst));
SaobeiMiniPayResponse response = (SaobeiMiniPayResponse) defaultSaobeiApiClient.execute(requst);
System.out.println("返回报文:" + JSON.toJSONString(response));
// {
// 'timeStamp': timeStamp,
// 'nonceStr': nonceStr,
// 'package': payPackage,
// 'signType': signType,
// 'paySign': paySign,
// }
resultData = ResultData.success(response);
}else {
resultData = ResultData.error(CodeMsg.STATION_NULL_INFO);
}
}else {
resultData = ResultData.error(CodeMsg.ALREADY_PAY);
}
}else {
resultData = ResultData.error(CodeMsg.NO_ORDER);
}
return gson.toJson(resultData);
}
// /***
// * 小程序云闪付扫呗回调
// * @param jsonObject
// * @return
// */
// @RequestMapping(value = "/getYunPayCallback", consumes = "application/json", method = RequestMethod.POST)
// @ResponseBody
// @Transactional
// public JSONObject getYunPayCallback(@RequestBody JSONObject jsonObject){
// JSONObject result = new JSONObject(); //返回给扫呗状态码
// logger.info("扫呗调用回调接口返回参数:" + jsonObject);
// if(jsonObject.containsKey("result_code") && jsonObject.get("result_code").toString().equals("01")){
//
// //业务逻辑
//
// //返给扫呗状态码
// result.put("return_code", "01");
// result.put("return_msg", "success");
// }else {
// result.put("return_code", "02");
// result.put("return_msg", "fail");
// }
// return result;
// }
//=========================================================== 以下为测试接口 =================================================================================//
/***
* 小程序云闪付拉起支付
* @param payInfoRequest
* @return
* @throws Exception
*/
@RequestMapping(value = {"/yunPayTest"}, consumes = {"application/json"}, method = {RequestMethod.POST})
@ResponseBody
public String yunPayTest(@RequestBody PayInfoRequest payInfoRequest) throws Exception {
// 智慧易加
// 商户号码:845104816000034
// 终端号:18241101
// 密钥:23570b46a955484d92038f6a18d2b9d6
Gson gson = new Gson();
ResultData resultData = null;
DefaultSaobeiApiClient defaultSaobeiApiClient = new DefaultSaobeiApiClient("23570b46a955484d92038f6a18d2b9d6"); //2ef428f4f76c414282e831baea9e4b0e
SaobeiMiniPayRequest requst = new SaobeiMiniPayRequest();
requst.setPay_ver("110");
requst.setPay_type("010");
requst.setService_id("015");
requst.setMerchant_no("845104816000034"); //852105942000011
requst.setTerminal_id("18241101"); //18237172
Random random = new Random();
String result = "";
for (int i = 0; i < 6; i++) {
result += random.nextInt(10);
}
String ordNo_1 = System.nanoTime() + result;
requst.setTerminal_trace(ordNo_1); //202003252204310000
requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date())); //"20200325220431"
String amt = payInfoRequest.getAmt();
requst.setTotal_fee("1");
String openId = payInfoRequest.getOpenId();
requst.setOpen_id("oRwjv4iHjSUgxNxOJOQ_60Ln7cno"); // oRwjv4iHjSUgxNxOJOQ_60Ln7cno obnG9jhDLvom5fGwuhYysmQTW4qQ
requst.setOrder_body("sdk测试");
String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayCallback";
logger.info("回调地址"+ notifyUrl);
requst.setNotify_url(notifyUrl);
requst.setSub_appid("wxe1135cd390b38a54"); // 智慧易加小程序: wxe1135cd390b38a54 wxe568c727d466aef9 智慧易加公众号:wxc8189d3b3a7283e0
System.out.println("请求报文"+ JSON.toJSONString(requst));
SaobeiMiniPayResponse response = (SaobeiMiniPayResponse)defaultSaobeiApiClient.execute(requst);
System.out.println("返回报文"+ JSON.toJSONString(response));
resultData = ResultData.success(response);
return gson.toJson(resultData);
}
/***
* 测试
* 公众号云闪付拉起支付
* @param payInfoRequest
* @return
* @throws Exception
*/
@RequestMapping(value = {"/yunPayGzhTest"}, consumes = {"application/json"}, method = {RequestMethod.POST})
@ResponseBody
public String yunPayGzhTest(@RequestBody PayInfoRequest payInfoRequest) throws Exception {
//智慧易加
// 商户号码:845104816000034
// 终端号:18241101
// 密钥:23570b46a955484d92038f6a18d2b9d6
Gson gson = new Gson();
ResultData resultData = null;
//创建client
SaobeiApiClient client = new DefaultSaobeiApiClient<>("23570b46a955484d92038f6a18d2b9d6");
//创建requst
SaobeiJsPayRequest requst = new SaobeiJsPayRequest();
requst.setPay_ver("110");
requst.setPay_type("010");
requst.setService_id("012");
requst.setMerchant_no("845104816000034");
requst.setTerminal_id("18241101");
Random random = new Random();
String result = "";
for (int i = 0; i < 6; i++) {
result += random.nextInt(10);
}
String ordNo_1 = System.nanoTime() + result;
requst.setTerminal_trace(ordNo_1); //202003252204310000
requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()));
requst.setTotal_fee("1");
requst.setSub_appid("wxc8189d3b3a7283e0");
requst.setOpen_id("oJR5R6r4EJhaORFcPap70r_mtFZo"); //oJR5R6r4EJhaORFcPap70r_mtFZo //oRwjv4iHjSUgxNxOJOQ_60Ln7cno
requst.setOrder_body("sdk测试");
String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayGzhCallback";
logger.info("回调地址:"+ notifyUrl);
requst.setNotify_url(notifyUrl);
//发送请求
System.out.println("请求报文:"+JSON.toJSONString(requst));
SaobeiJsPayResponse response = client.execute(requst);
System.out.println("返回报文:"+JSON.toJSONString(response));
resultData = ResultData.success(response);
return gson.toJson(resultData);
}
}