/**
* 商户编号
*/
@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支付得改一下自己对应跳转的位置
}
代码需要根据对接的商户信息进行配置修改