大吉支付的下单,回调和查询状态

@Repository(value = ConstantsPay.DaJi_PAY + "Processor")
@Log4j2
public class DajiPayProcessor extends AbstractPay {
    @Override
    public String orderPay(PayChannelNew payChannelNew, PayPlatformNew payPlatformNew, ReqPayRechargeNew reqPayRecharge) {
        Map<String, String> params = new HashMap<>();
        params.put("return_type", "json");
        params.put("api_code", payPlatformNew.getMerId());
        params.put("is_type", payChannelNew.getPayMethod());
        params.put("price", reqPayRecharge.getMoney().setScale(2, BigDecimal.ROUND_HALF_UP).toString());
        params.put("order_id", reqPayRecharge.getOrderNo());
        params.put("mark", "buy");
        params.put("return_url", payReturnUrl);
        params.put("notify_url", payCallbackUrl + ConstantsPay.DaJi_PAY);
        params.put("time", System.currentTimeMillis() + "");

        //对参数名按照ASCII升序排序
        Object[] key = params.keySet().toArray();
        Arrays.sort(key);
        //生成加密原串
        StringBuffer res = new StringBuffer();
        for (int i = 0; i < key.length; i++) {
            res.append(key[i] + "=" + params.get(key[i]) + "&");
        }
        //再拼接秘钥
        String src = res.append("key=" + payPlatformNew.getSignMd5()).toString();
        //MD5加密并转为大写
        String sign = DigestUtils.md5Hex(src).toUpperCase();

        log.warn(sign);
        params.put("sign", sign);
        log.warn(JsonUtil.object2Json(params));

        MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        params.forEach((k, v) -> map.add(k, v));

        //发送请求
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(map, httpHeaders);

        Map<String, Object> resultMap = null;
        try {
            resultMap = restTemplate.postForObject(payPlatformNew.getPlatPayUrl(), httpEntity, Map.class);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        System.err.println(JsonUtil.object2Json(resultMap));
        if (!CollectionUtils.isEmpty(resultMap) && resultMap.containsKey("payurl")) {
            System.out.println(resultMap.get("payurl").toString());
            return resultMap.get("payurl").toString();
        }
        return null;
    }

    @Override
    public boolean queryPay(MemberPayJour payJour, PayPlatformNew payPlatformNew, PayChannelNew payChannelNew) {
        SortedMap<String, String> reqMap = new TreeMap<>();
        reqMap.put("api_code", payPlatformNew.getMerId());
        reqMap.put("is_type", payChannelNew.getPayMethod());
        reqMap.put("order_id", payJour.getOrder_no());
        reqMap.put("price", payJour.getMoney().setScale(2, BigDecimal.ROUND_HALF_UP).toString());

        //对参数名按照ASCII升序排序
        Object[] key = reqMap.keySet().toArray();
        Arrays.sort(key);
        //生成加密原串
        StringBuffer res = new StringBuffer();
        for (int i = 0; i < key.length; i++) {
            res.append(key[i] + "=" + reqMap.get(key[i]) + "&");
        }
        //再拼接秘钥
        String src = res.append("key=" + payPlatformNew.getSignMd5()).toString();
        //MD5加密并转为大写
        String sign = DigestUtils.md5Hex(src).toUpperCase();
        reqMap.put("sign",sign);

        MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>();
        requestMap.setAll( reqMap );

        log.warn( JsonUtil.object2Json( requestMap ) );

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType( MediaType.APPLICATION_FORM_URLENCODED );
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>( requestMap, httpHeaders );

        Map<String,Object> resultMap=null;
        try {
            resultMap = restTemplate.postForObject( payPlatformNew.getPlatPayUrl(), httpEntity, Map.class );
        } catch ( Exception e ) {
            log.error( e.getMessage(), e );
        }
        log.warn( JsonUtil.object2Json( resultMap ) );
        if ( !CollectionUtils.isEmpty( resultMap ) ) {
            int status = Integer.parseInt( resultMap.getOrDefault( "status", 0 ).toString() );
            if ( status == 1 ) {
                BigDecimal real_price   = new BigDecimal( resultMap.getOrDefault( "real_price", 0 ).toString() );
                String     paysapi_id = resultMap.getOrDefault( "paysapi_id", "" ).toString();
                payJour.setSub_money(real_price);
                payJour.setTrade_sn(paysapi_id);
                return true;
            }
        }
        return false;
    }

    @Override
    public String callbackPay(Map<String, Object> requestMap, String realIp) {
        // 订单id
        String order_id = requestMap.getOrDefault("order_id", "").toString();
        // 上游订单ID
        String paysapi_id = requestMap.getOrDefault("paysapi_id", "").toString();

        MemberPayJour payJour = payJourMapper.findByOrderNo(order_id);

        if ("1".equals(payJour.getStatus())) {
            log.warn("订单已成功,无需继续回调");
            return "success";
        }

        PayPlatformNew payPlatformNew = payPlatformNewMapper.selectByPrimaryKey(Integer.valueOf(payJour.getPlatform_id()));
        PayChannelNew payChannelNew = payChannelNewMapper.selectByPrimaryKey(Integer.valueOf(payJour.getChannel_id()));

        BigDecimal price = new BigDecimal(requestMap.getOrDefault("price", 0).toString());
        BigDecimal real_price = new BigDecimal(requestMap.getOrDefault("real_price", 0).toString());
        String is_type = requestMap.getOrDefault("is_type", "").toString();
        String mark = requestMap.getOrDefault("mark", "").toString();
        String code = requestMap.getOrDefault("code", "").toString();
        String api_code = requestMap.getOrDefault("api_code", "").toString();
        String sign = requestMap.getOrDefault("sign", "").toString();

        SortedMap<String, Object> bodyMap = new TreeMap<>();
        bodyMap.put("order_id", order_id);
        bodyMap.put("paysapi_id", paysapi_id);
        bodyMap.put("price", price);
        bodyMap.put("real_price", real_price);
        bodyMap.put("mark", mark);
        bodyMap.put("code", code);
        bodyMap.put("is_type", is_type);
        bodyMap.put("api_code", api_code);

        String signStr = this.assemblyUrl(bodyMap) + "&key=" + payPlatformNew.getSignMd5();
        log.warn(signStr);
        String rel = DigestUtils.md5Hex(signStr);
        log.warn(rel + ":" + sign);

        //判断是否匹配
        if (rel.equalsIgnoreCase(sign)) {
            if ("1".equals(code)) {
                payJour.setSub_money(real_price);
                payJour.setTrade_sn(paysapi_id);
                return payService.updatePayJourStatus(payJour, payChannelNew.getDiscountBill(), new String[]{"success",
                        "fail"}, payChannelNew.getName());
            }
        }
        return "fail";
    }
}

猜你喜欢

转载自blog.csdn.net/programmer188/article/details/110198051