Pārlūkot izejas kodu

云闪付支付

jk-GitHub-coder 3 gadi atpakaļ
vecāks
revīzija
de9636b13d

+ 285 - 8
YijiaRestful/src/main/java/com/platform/yijia/controller/PayController.java

@@ -11,6 +11,9 @@ import com.platform.yijia.utils.*;
 import com.platform.yijia.utils.redis.RedisCacheUtil;
 import com.platform.yijia.utils.weixinapp.WeiXinUserUtil;
 import com.platform.yijia.utils.weixinapp.WxPushUtil;
+import com.saobei.open.sdk.DefaultSaobeiApiClient;
+import com.saobei.open.sdk.model.requst.trade.SaobeiMiniPayRequest;
+import com.saobei.open.sdk.model.response.trade.SaobeiMiniPayResponse;
 import lombok.SneakyThrows;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 import org.apache.commons.lang3.StringUtils;
@@ -234,21 +237,21 @@ public class PayController {
                         //reqData.put("ylTrmNo", ""); //银联终端号
                         //reqData.put("terminalId", ""); //TQ机具编号
                         //reqData.put("deviceNo ", "1111"); //设备号
-                      //  reqData.put("identityFlag", ""); //是否是实名支付
-    //                reqData.put("buyerIdType", "IDCARD"); //证件类型
-    //                reqData.put("buyerIdNo", "410523198701054018"); //证件号
-                       // reqData.put("buyerName", "张三"); //买家姓名
-                       // reqData.put("mobileNum", ""); //手机号
-                       // reqData.put("extend", ""); //备用
+                        //  reqData.put("identityFlag", ""); //是否是实名支付
+                        //                reqData.put("buyerIdType", "IDCARD"); //证件类型
+                        //                reqData.put("buyerIdNo", "410523198701054018"); //证件号
+                        // reqData.put("buyerName", "张三"); //买家姓名
+                        // reqData.put("mobileNum", ""); //手机号
+                        // reqData.put("extend", ""); //备用
                         String req= SXFPaySign.getSXFPay(reqData);
-                         logger.debug("参数信息:"+req);
+                        logger.debug("参数信息:"+req);
                         System.out.println("req:" + req);
                         //此处不要改变reqData里面值的顺序用LinkedHashMap
                         HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
                         //组装加密串
                         String signContent = RSASignature.getOrderContent(reqMap);
                         System.out.println("拼接后的参数:" + signContent);
-                           logger.debug("拼接后的参数:"+signContent);
+                        logger.debug("拼接后的参数:"+signContent);
                         //sign
                         String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
                         System.out.println("============签名:" + sign);
@@ -296,6 +299,250 @@ public class PayController {
         return gson.toJson(resultData);
     }
 
+    /**
+     * 支付接口,前台上传支付信息,支付数据落地生产订单,调用随行付支付接口
+     * @param
+     * @return
+     */
+    @RequestMapping(value = "/getPayChannelInfo", consumes = "application/json", method = RequestMethod.POST)
+    @ResponseBody
+    public String getPayChannelInfo(@RequestBody PayInfoRequest payInfoRequest){
+        Gson gson =new Gson();
+        ResultData resultData =null;
+        String openId = payInfoRequest.getOpenId(); //用户openId
+        String userType=payInfoRequest.getUserType();//用户登录类型 1 公众号。2 小程序
+        String ordNo = payInfoRequest.getOrdNo();
+        AppUserInfo appUserInfo =new AppUserInfo();
+        //订单类型 是小程序还是公众号
+        appUserInfo.setUserType(userType);
+        if(userType.equals("1")){
+            //1 是微信
+            appUserInfo.setMinaOpenid(openId);
+        }else if(userType.equals("2")){
+            //2是支付宝
+            appUserInfo.setALiId(openId);
+        }
+        //appUserInfo.setStationId(stationInfos.getGroupId());
+        StationInfo stationInfo = new StationInfo();
+        stationInfo.setStationId(Integer.valueOf(payInfoRequest.getStationId()));
+        StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
+        appUserInfo.setStationId(stationInfos.getGroupId());
+        AppUserInfo appUserInfos =appUserInfoService.getAppUserInfo(appUserInfo);
+        if(appUserInfos!=null){
+            //调用聚合支付
+            try{
+                //根据订单号查询订单信息
+                PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
+                if(payOrder!=null ){
+                    if(payOrder.getStatus() !=null && payOrder.getStatus().equals("0")){
+                        if(payInfoRequest.getPayChannelType() !=null && payInfoRequest.getPayChannelType().equals("2")){
+                            //云闪付支付方式
+                            Map<String, String> 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());
+                                requst.setOpen_id(payInfoRequest.getOpenId());  // oRwjv4iHjSUgxNxOJOQ_60Ln7cno   obnG9jhDLvom5fGwuhYysmQTW4qQ
+
+                                //订单内容
+                                String orderBody = payOrder.getOilName() + "-" +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
+
+                                logger.info("请求报文:" + JSON.toJSONString(requst));
+                                SaobeiMiniPayResponse response = (SaobeiMiniPayResponse) defaultSaobeiApiClient.execute(requst);
+                                logger.info("返回报文:" + JSON.toJSONString(response));
+
+                                //返回前端字段
+                                Map<String, Object> reqData = new HashMap<>();
+                                //Map<String, Object> resultMap = new HashMap<>();
+                                if(response !=null && response.getResult_code().equals("01")){
+                                    reqData.put("timeStamp", response.getTimeStamp());
+                                    reqData.put("payPackage", response.getPackage_str());
+                                    reqData.put("signType", response.getSignType());
+                                    reqData.put("paySign", response.getPaySign());
+                                    reqData.put("return_msg", response.getReturn_msg());
+                                    reqData.put("merchant_name", response.getMerchant_name());
+                                    reqData.put("total_fee", response.getTotal_fee());
+                                    reqData.put("terminal_time", response.getTerminal_time());
+                                    reqData.put("terminal_trace", response.getTerminal_trace());
+                                    reqData.put("code", response.getResult_code());
+                                }else if(response !=null && response.getResult_code().equals("02")){
+                                    reqData.put("code", response.getResult_code());
+                                    reqData.put("return_msg", response.getReturn_msg());
+                                }else {
+                                    //自己定义
+                                    reqData.put("code", "03");
+                                    reqData.put("return_msg", "当前支付系统参数配置错误请检查!");
+                                }
+                                //resultMap.put("respData", reqData);
+                                logger.info("云闪付返回给前端字段:" + JSON.toJSONString(reqData));
+                                resultData = ResultData.success(reqData);
+                            }else {
+                                resultData = ResultData.error(CodeMsg.STATION_NULL_INFO);
+                            }
+                        }else{
+                            //将业务参数存放在 JSON 对象中
+                            JSONObject reqData = new JSONObject();
+                            reqData.put("ordNo", payOrder.getOrderNo()); //商户订单号
+                            //reqData.put("subMechId", ""); //子商户号
+                            reqData.put("amt", payOrder.getAmt()); //订单总金额
+                            //reqData.put("amt", "0.01");
+                            //reqData.put("discountAmt", ""); //参与优惠金额
+                            //reqData.put("unDiscountAmt", ""); //不参与优惠金额
+                            Map<String, String> stationAppIdAndAppSecret = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
+                            if(stationAppIdAndAppSecret !=null && stationAppIdAndAppSecret.containsKey("appId") && stationAppIdAndAppSecret.containsKey("mno")){
+                                if(userType.equals("1")){
+                                    reqData.put("subAppid", stationAppIdAndAppSecret.get("appId")); //微信小程序
+                                    logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("appId"));
+                                }else if(userType.equals("2")){
+                                    reqData.put("subAppid", stationAppIdAndAppSecret.get("aliAppId")); //支付宝小程序
+                                    logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("aliAppId"));
+                                }
+                                reqData.put("mno", stationAppIdAndAppSecret.get("mno")); //商户编号
+                                logger.info("商户编号:"+ stationAppIdAndAppSecret.get("mno"));
+                            }
+                            if(userType.equals("1")){
+                                //1 是微信小程序
+                                reqData.put("payType", "WECHAT"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
+                                reqData.put("payWay", "03"); //支付方式  02 公众号/服 务窗/js支付 03 小程序
+                                reqData.put("userId", appUserInfos.getMinaOpenid()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
+                            }else if(userType.equals("2")){
+                                //2 是支付宝
+                                reqData.put("payType", "ALIPAY"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
+                                reqData.put("payWay", "03"); //支付方式  02 公众号/服 务窗/js支付 03 小程序
+                                reqData.put("userId", appUserInfos.getALiId()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
+                            }
+                            //reqData.put("timeExpire", "10"); //订单失效时间, 以分钟为单位
+                            //reqData.put("limitPay", "00"); //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
+
+                            reqData.put("subject", payOrder.getOilName() + " - " +payOrder.getStationName()); //订单标题
+                            //reqData.put("hbFqNum", "6"); //花呗分期数,仅可上送 6 或 12
+                            reqData.put("tradeSource", "01"); //交易来源 01服务商,02收银台,03硬件
+                            reqData.put("trmIp", "172.16.2.1");//商家ip地址
+                            // reqData.put("customerIp", ""); //持卡人ip地址,银联js支付时必传
+
+                            //reqData.put("outFrontUrl", ""); //js 支付,前台 成功通知地址
+                            reqData.put("outFrontFailUrl", ""); //js 支付,前台 事变通知地址
+                            //globalPrefix
+                            String notifyUrl = "https://"+domainName+"/"+globalPrefix+"/getCallback";
+                            logger.info("随行付调用回调地址:" + notifyUrl);
+                            //reqData.put("notifyUrl", "https://www.huijy.net/api/getCallback"); //回调地址
+                            reqData.put("notifyUrl", notifyUrl); //回调地址
+                            //reqData.put("needReceipt", "00"); //电子发票功能 微信开具电子 发票使用
+                            //reqData.put("ledgerAccountFlag", "00"); //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
+                            //reqData.put("ledgerAccountEffectTime", "00"); //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
+                            // reqData.put("ruleId", "00"); //同 步 分 账 规 则 id
+                            // reqData.put("fusruleId", "00"); //同步分账规则
+                            //reqData.put("ylTrmNo", ""); //银联终端号
+                            //reqData.put("terminalId", ""); //TQ机具编号
+                            //reqData.put("deviceNo ", "1111"); //设备号
+                            //  reqData.put("identityFlag", ""); //是否是实名支付
+                            //                reqData.put("buyerIdType", "IDCARD"); //证件类型
+                            //                reqData.put("buyerIdNo", "410523198701054018"); //证件号
+                            // reqData.put("buyerName", "张三"); //买家姓名
+                            // reqData.put("mobileNum", ""); //手机号
+                            // reqData.put("extend", ""); //备用
+                            String req= SXFPaySign.getSXFPay(reqData);
+                            logger.debug("参数信息:"+req);
+                            System.out.println("req:" + req);
+                            //此处不要改变reqData里面值的顺序用LinkedHashMap
+                            HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
+                            //组装加密串
+                            String signContent = RSASignature.getOrderContent(reqMap);
+                            System.out.println("拼接后的参数:" + signContent);
+                            logger.debug("拼接后的参数:"+signContent);
+                            //sign
+                            String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
+                            System.out.println("============签名:" + sign);
+                            reqMap.put("sign", sign);
+                            String reqStr = JSON.toJSONString(reqMap);
+                            System.out.println("请求参数:" + reqMap);
+                            System.out.println("请求参数:" + reqStr);
+                            //调用第三方接口地址
+                            //String url = "https://openapi-test.tianquetech.com/order/jsapiScan";//测试地址
+                            String url = "https://openapi.suixingpay.com/order/jsapiScan";//生产地址
+                            String resultJson = HttpUtils.connectPostUrl(url, reqStr);
+                            System.out.println("返回信息:" + resultJson);
+                            //   logger.debug("返回信息:"+resultJson);
+                            //不要对reqData排序 所以用LinkedHashMap
+                            HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
+
+                            Map<String, Object> r = new HashMap<>(); //返回前端参数
+                            if ("0000".equals(result.get("code"))) {
+                                //验签
+                                String signResult = result.get("sign").toString();
+                                result.remove("sign");
+                                String resultStr = RSASignature.getOrderContent(result);
+                                System.out.println("resultStr: " + resultStr);
+                                //sign
+                                String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
+                                System.out.println("resultSign: " + resultSign);
+                                //组装加密串
+                                if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
+                                    System.out.println("===================验签成功==============");
+                                    logger.info("随行付返回字段:" +result);
+                                    r.put("code", result.get("code"));
+                                    r.put("msg", result.get("msg"));
+                                    //net.sf.json.JSONObject result = location.getJSONObject("result").getJSONObject("addressComponent");
+                                    JSONObject respData = (JSONObject)result.get("respData");
+                                    r.put("payTimeStamp", respData.get("payTimeStamp"));
+                                    r.put("ordNo", respData.get("ordNo"));
+                                    r.put("payPackage", respData.get("payPackage"));
+                                    r.put("bizMsg", respData.get("bizMsg"));
+                                    r.put("paySign", respData.get("paySign"));
+                                    r.put("bizCode", respData.get("bizCode"));
+                                    r.put("payAppId", respData.get("payAppId"));
+                                    r.put("sxfUuid", respData.get("sxfUuid"));
+                                    r.put("paynonceStr", respData.get("paynonceStr"));
+                                    r.put("paySignType", respData.get("paySignType"));
+                                    r.put("uuid", respData.get("uuid"));
+
+                                    r.put("orgId", result.get("orgId"));
+                                    r.put("signType", result.get("signType"));
+                                    r.put("reqId", result.get("reqId"));
+                                }
+                            }else {
+                                r.put("code", result.get("code"));
+                                r.put("msg", result.get("msg"));
+                            }
+                            logger.info("随行付支付时系统返回前端参数字段:" +r);
+                            resultData=ResultData.success(r);
+                        }
+                    }else {
+                        resultData=ResultData.error(CodeMsg.ALREADY_PAY);
+                    }
+                }else {
+                    resultData=ResultData.error(CodeMsg.YEWU_FAIL,"未查询到订单");
+                }
+            }catch (Exception e){
+                resultData=ResultData.error(CodeMsg.YEWU_FAIL,"订单支付失败");
+                e.printStackTrace();
+            }
+        }else{
+            //返回失败支付失败信息
+            resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
+        }
+        return gson.toJson(resultData);
+    }
 
     /**
      * 验证商户信息查询
@@ -742,6 +989,36 @@ public class PayController {
         return req;
     }
 
+
+    /***
+     * 小程序云闪付扫呗回调
+     * @param params
+     * @return
+     */
+    @RequestMapping(value = "/getYunPayCallback", consumes = "text/xml", method = RequestMethod.POST)
+    @ResponseBody
+    @Transactional
+    public net.sf.json.JSONObject getYunPayCallback(@RequestBody String params){
+        logger.info("    =======================================云闪付(扫呗)  开始  调用回调接口===============================================");
+        net.sf.json.JSONObject result = new net.sf.json.JSONObject();       //返回
+        YunPayCallBack yunPayCallBack = JSON.parseObject(params, YunPayCallBack.class);
+        logger.info("云闪付扫呗调用回调接口返回参数:" + params);
+        //logger.info("云闪付扫呗调用回调接口状态码:" + yunPayCallBack.getResult_code());
+        if(yunPayCallBack.getResult_code() !=null && yunPayCallBack.getResult_code().equals("01")){
+            logger.info("                   -------------------------云闪付回调成功--------------------------                      ");
+            //业务逻辑
+
+            //返给云闪付状态码
+            result.put("return_code", "01");
+            result.put("return_msg", "success");
+        }else {
+            result.put("return_code", "02");
+            result.put("return_msg", "fail");
+        }
+        logger.info("返给云闪付结果信息:" + result);
+        return result;
+    }
+
     //插入客户信息
     public CustomerManage insertCustomerManage(Map infoMap) throws ParseException {
         CustomerManage customerManage = new CustomerManage();   //存放客户信息

+ 26 - 26
YijiaRestful/src/main/java/com/platform/yijia/controller/PayOrderController.java

@@ -202,33 +202,33 @@ public class PayOrderController {
                             resultData = ResultData.error(CodeMsg.NO_PERSONNAL);
                         }
                     } else {
-                        resultData = ResultData.error(CodeMsg.NO_PERSONNAL);
+                        //resultData = ResultData.error(CodeMsg.NO_PERSONNAL);
                         //根据油站和油枪获取加油员
-//                        HashMap<String, Object> params = new HashMap<>();
-//                        params.put("oliGunNo", payOrderRequest.getOilGun());
-//                        params.put("stationId", payOrderRequest.getStationId());
-//                        List<Map> mapResultList = payOrderMapper.selectPersonelName(params);    //使用list原因:一个枪号对应多个加油员场景
-//                        logger.info("加油员信息:"+ mapResultList.toString());
-//                        if(mapResultList != null && mapResultList.size() > 0){
-//                            String oilPersonnel = "";
-//                            String oilPersonnelId ="";
-//                            for (Map per : mapResultList){
-//                                if(per.containsKey("personnelName") && per.get("personnelName").toString() !=null && per.get("personnelName").toString() !=""){
-//                                    oilPersonnel += per.get("personnelName").toString() +",";
-//                                    oilPersonnelId += per.get("personnelId").toString() +",";
-//                                }
-//                            }
-//                            if(oilPersonnel !=""){
-//                                payOrder.setOilPersonnel(oilPersonnel.substring(0, oilPersonnel.length()-1));   //加油员
-//                                payOrder.setOilPersonnelId(oilPersonnelId.substring(0, oilPersonnelId.length()-1));
-//                            }
-////                            payOrder.setOilPersonnel(mapResultList.get(0).get("").toString());   //加油员
-////                            payOrder.setOilPersonnelId(oilPersonnelId.substring(0, oilPersonnelId.length()-1));
-//                            payOrderMapper.insertSelective(payOrder);
-//                            resultData = ResultData.success(resultMap);
-//                        }else {
-//                            resultData = ResultData.error(CodeMsg.NO_PERSONNAL);
-//                        }
+                        HashMap<String, Object> params = new HashMap<>();
+                        params.put("oliGunNo", payOrderRequest.getOilGun());
+                        params.put("stationId", payOrderRequest.getStationId());
+                        List<Map> mapResultList = payOrderMapper.selectPersonelName(params);    //使用list原因:一个枪号对应多个加油员场景
+                        logger.info("加油员信息:"+ mapResultList.toString());
+                        if(mapResultList != null && mapResultList.size() > 0){
+                            String oilPersonnel = "";
+                            String oilPersonnelId ="";
+                            for (Map per : mapResultList){
+                                if(per.containsKey("personnelName") && per.get("personnelName").toString() !=null && per.get("personnelName").toString() !=""){
+                                    oilPersonnel += per.get("personnelName").toString() +",";
+                                    oilPersonnelId += per.get("personnelId").toString() +",";
+                                }
+                            }
+                            if(oilPersonnel !=""){
+                                payOrder.setOilPersonnel(oilPersonnel.substring(0, oilPersonnel.length()-1));   //加油员
+                                payOrder.setOilPersonnelId(oilPersonnelId.substring(0, oilPersonnelId.length()-1));
+                            }
+//                            payOrder.setOilPersonnel(mapResultList.get(0).get("").toString());   //加油员
+//                            payOrder.setOilPersonnelId(oilPersonnelId.substring(0, oilPersonnelId.length()-1));
+                            payOrderMapper.insertSelective(payOrder);
+                            resultData = ResultData.success(resultMap);
+                        }else {
+                            resultData = ResultData.error(CodeMsg.NO_PERSONNAL);
+                        }
                     }
                 }else {
                     //登录人验证失败

+ 47 - 36
YijiaRestful/src/main/java/com/platform/yijia/controller/SaoBeiPayController.java

@@ -26,6 +26,7 @@ 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;
@@ -130,7 +131,10 @@ public class SaoBeiPayController {
                     requst.setTerminal_id(staPayChannelInfo.get("terminalId"));                 //终端号
                     requst.setTerminal_trace(payOrder.getOrderNo());                            //订单号
                     requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()));
-                    requst.setTotal_fee(payOrder.getAmt().toString());
+                    //云闪付金额单位为分
+                    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();
@@ -216,13 +220,10 @@ public class SaoBeiPayController {
                     requst.setTerminal_id(staPayChannelInfo.get("terminalId"));                 //终端号   18241101
                     requst.setTerminal_trace(payOrder.getOrderNo());                            //订单号   202003252204310000 6683315853083916109905
                     requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()));      //"20200325220431"
-
-                    //requst.setTotal_fee(String.valueOf(payOrder.getAmt()));
-                    Double amt = payOrder.getAmt();
-//                    String amtStr = amt + "";
-//                    requst.setTotal_fee(amtStr);
-//                    requst.setTotal_fee(amt.toString());
-                    requst.setTotal_fee(payInfoRequest.getAmt());
+                    //云闪付单位为分
+                    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
 
@@ -231,14 +232,24 @@ public class SaoBeiPayController {
                     requst.setOrder_body(orderBody);
                     //回调地址
                     String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayCallback";
-                    logger.info("回调地址" + notifyUrl);
+                    logger.info("回调地址" + notifyUrl);
                     requst.setNotify_url(notifyUrl);
                     //小程序appId
                     requst.setSub_appid(staPayChannelInfo.get("appId"));          //  wxe1135cd390b38a54    wxe568c727d466aef9        智慧易加公众号:wxc8189d3b3a7283e0
 
-                    System.out.println("请求报文" + JSON.toJSONString(requst));
+                    System.out.println("请求报文" + JSON.toJSONString(requst));
                     SaobeiMiniPayResponse response = (SaobeiMiniPayResponse) defaultSaobeiApiClient.execute(requst);
-                    System.out.println("返回报文" + JSON.toJSONString(response));
+                    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);
@@ -252,30 +263,30 @@ public class SaoBeiPayController {
         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();       //返回给扫呗状态码
-        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 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;
+//    }
 
 //===========================================================  以下为测试接口   =================================================================================//
 
@@ -313,7 +324,7 @@ public class SaoBeiPayController {
 
         requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()));      //"20200325220431"
         String amt = payInfoRequest.getAmt();
-        requst.setTotal_fee("0.01");
+        requst.setTotal_fee("1");
         String openId = payInfoRequest.getOpenId();
         requst.setOpen_id("oRwjv4iHjSUgxNxOJOQ_60Ln7cno");  // oRwjv4iHjSUgxNxOJOQ_60Ln7cno   obnG9jhDLvom5fGwuhYysmQTW4qQ
         requst.setOrder_body("sdk测试");

+ 9 - 0
YijiaRestful/src/main/java/com/platform/yijia/param/request/PayInfoRequest.java

@@ -15,6 +15,15 @@ public class PayInfoRequest {
     private String mno;
     private String subject; //商品名称
     private String payType;
+    private String payChannelType;      //支付通道类型
+
+    public String getPayChannelType() {
+        return payChannelType;
+    }
+
+    public void setPayChannelType(String payChannelType) {
+        this.payChannelType = payChannelType;
+    }
 
     public String getPayType() {
         return payType;

+ 33 - 0
YijiaRestful/src/main/java/com/platform/yijia/pojo/YunPayCallBack.java

@@ -0,0 +1,33 @@
+package com.platform.yijia.pojo;
+
+import lombok.Data;
+
+/***
+ * 云闪付回调接收参数实体类
+ */
+@Data
+public class YunPayCallBack {
+
+    private String attach;                  //附加数据,原样返回
+    private String channel_trade_no;        //通道订单号,微信订单号、支付宝订单号等
+    private String end_time;                //支付完成时间,yyyyMMddHHmmss,全局统一时间格式
+    private String key_sign;                //签名字符串,拼装所有必传参数+令牌,32位md5加密转换
+    private String merchant_name;           //商户名称
+    private String merchant_no;             //商户号
+    private String out_trade_no;            //利楚唯一订单号
+    private String pay_type;                //支付方式, 010 微信, 020 支付宝, 060 qq钱包, 080 京东钱包, 090 口碑, 100 翼支付
+    private String pay_time;                //当前支付终端交易时间,yyyyMMddHHmmss,全局统一时间格式,与pay_trace同时传递
+    private String receipt_fee;             //实收金额, pay_type为010、020、090时必填
+    private String pay_trace;               //当前支付终端流水号,与pay_time同时传递,返回时不参与签名
+    private String result_code;             //业务结果: 01 成功 , 02 失败
+
+    private String return_code;             //响应码: 01 成功 , 02 失败,响应码仅代表通信状态,不代表业务结果
+    private String return_msg;              //返回信息提示,“签名失败”,“参数格式校验错误"等
+    private String terminal_id;             //终端号
+    private String terminal_time;           //终端交易时间,yyyyMMddHHmmss,全局统一时间格式(01时参与拼接)
+    private String terminal_trace;          //终端流水号,此处传商户发起预支付或公众号支付时所传入的交易流水号
+
+    private String total_fee;               //金额,单位分
+    private String user_id;                 //付款方用户id,“微信openid”、“支付宝账户”、“qq号”等
+
+}