java对接杉德支付完整代码

/**
     * 商户编号
     */
    @Value("${sdpay.merch_mid}")
    private String merchMid;

    /**
     * 商户密钥
     */
    @Value("${sdpay.mer_key}")
    private String merKey;

    /**
     * 回调地址
     */
    @Value("${sdpay.notify_url}")
    private String notifyUrl;

    /**
     * 商户密钥
     */
    @Value("${sdpay.merprivate_key}")
    private String meprivateKey;


    @Override
    public ResponseData  createOrder(RepaychargeReq repaychargeReq, UserVo userVo) {
        // 参考文档:body 前面这些是必须需要签名的所以放在签名
        Map<String, String> body = new HashMap<>();
        Date date = new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");//时间转换格式
        body.put("version", "1.0"); // 版本号
        body.put("mer_no",merchMid);//商户编号
        body.put("mer_key",merKey);//商户密钥
        body.put("mer_order_no",repaychargeReq.getOrderId());//订单号
        body.put("create_time",sdf.format(date));//创建时间
        body.put("order_amt",repaychargeReq.getOrderAmt()/100+"");//订单金额
        body.put("notify_url",notifyUrl);//回调地址
        body.put("return_url","");//支付后返回的商户显示页面 没有就填 “”
        body.put("create_ip",repaychargeReq.getCreateIp().replace(".","_"));//转换IP地址
        body.put("store_id","000000");//门店号
        JSONObject jsonObject = new JSONObject(); // 支付扩展域 内容字段
//        jsonObject.put("wx_app_id",sandpayConf.getWxappid()); //appid
//        jsonObject.put("gh_ori_id",sandpayConf.getWxorid()); // "gh_ori_id":"小程序原始id
//        jsonObject.put("miniProgramType","1");
        //jsonObject.put("cardNo","6217214402025018445");//银行卡号
        body.put("pay_extra",jsonObject.toString());//支付扩展域
        body.put("accsplit_flag","NO");//分账标识
        body.put("sign_type","MD5");//签名类型
 //       body.put("gh_static_url",sandpayConf.getWxStaticUrl()); //小程序云静态网站url" 如果是小程序支付,一定要加上,不然支付请求就看不到了,直接问领导拿
        try {
            // 报文签名
            String reqSign = sadeSign(body);
            body.put("sign",reqSign);//MD5签名结果
            body.put("goods_name",repaychargeReq.getGoodsName());//商品名称
            body.put("expire_time",endTime(date));//失效时间
            body.put("product_code",repaychargeReq.getProductCode());//  支付产品,多个以英文逗号分隔,具体产品见产品编码文档
            body.put("clear_cycle","0");//清算模式
            body.put("jump_scheme","sandcash://scpay");
//            Map<String, Object> metaOption = new HashMap<>();
            JSONObject metaOption = new JSONObject();//app需要封装值不用动
            metaOption.put("s","Android");
            metaOption.put("n","");
            metaOption.put("id","");
            metaOption.put("sc","测试");
            body.put("meta_option",metaOption.toString());
            //APPRY_MIXIENET 官方的接口地址
            //这一段就是官方给的页面地址 拼接参数 #/alipayh5 ,弄好后,放回给客户端,让他打开地址进行支付
            String APPRY_MIXIENET="https://sandcash.mixienet.com.cn/pay/h5/alipaycode";
            String url = APPRY_MIXIENET+"?"+getUrl(body);//拼接支付地址
            HashMap<String, String> map = new HashMap<>();
            map.put("url", url);
            return ResponseData.success(map);
        } catch (Exception e) {
            log.error("CashierPayServlet post error <<<", e);
        }
        return null;
    }
    /**
     * 签名方法
     *
     * @param data 待签名数据
     * @return
     * @throws Exception
     */
    public String sadeSign(Map<String, String> data) throws Exception {
        if (null == data) {
            return null;
        } else {
            String merprivateKey = meprivateKey; //杉德的md5 key
            return  generateSignature(data, merprivateKey);
        }
    }

    /**
     * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
     *
     * @param data 待签名数据
     * @param key API密钥
     * @return  String 签名
     * @see Exception
     */
    public static String generateSignature(final Map<String, String> data, String key) throws Exception {
        Set<String> keySet = data.keySet();
        String[] keyArray = keySet.toArray(new String[keySet.size()]);
        Arrays.sort(keyArray);
        StringBuilder sb = new StringBuilder();
        for (String k : keyArray) {
            if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
                sb.append(k).append("=").append(data.get(k).trim()).append("&");
        }
        sb.append("key=").append(key);
        return MD5(sb.toString());
    }

    /**
     *
     *
     * @param data 待处理数据
     * @return String MD5结果
     * @see Exception
     */
    public static String MD5(String data) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] array = md.digest(data.getBytes("UTF-8"));
        StringBuilder sb = new StringBuilder();
        for (byte item : array) {
            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
        }
        return sb.toString().toUpperCase();
    }

    public String endTime(Date creatTime){
        //设置生效时间为一小时后
        Calendar cal = Calendar.getInstance();
        cal.setTime(creatTime);
        cal.add(Calendar.HOUR, 1);// 24小时制
        Date effectivetime = cal.getTime();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.format(effectivetime);
    }
    public  String getUrl(Map<String, String> jsonObject) throws UnsupportedEncodingException {
        String paramStr = "";
        if (null != jsonObject) {
            for (String key : jsonObject.keySet()) {
                if (!StringUtils.isEmpty(paramStr)) {
                    paramStr += "&";
                }
                if(key.equals("gh_static_url")){
                    paramStr += key + "=" + jsonObject.get(key);
                }else{
                    paramStr += key + "=" + URLEncoder.encode(jsonObject.get(key).toString(),"utf-8");
                }
            }
        }
        return  paramStr; //注意这里哦,如果不是微信小程序h5支付得改一下自己对应跳转的位置
    }

代码需要根据对接的商户信息进行配置修改

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

variation8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值