支付宝免密代扣签约SDK后台拼接(JAVA代码)
我是在做小程序时遇到的困难,在多方支持下才发现支付宝官方文档有很大的漏洞0.0,所以附上完整成功版供大家使用。开发时请结合支付宝官方免密代扣签约文档。
语言JAVA,环境SpringMVC。
此处附上正确JAVA拼接签约SDK方法。方法传入参数的是唯一标识位(我用的是用户卡号,你们随意,只要保证唯一性就可)。代码中的某些参数为你自己程序的参数,比如app_id和私钥,请自行修改。
@Override
public Map<String, Object> createAliContractSDK(String cardNo) throws AlipayApiException, Exception {
//模型全靠手动拼,不可用支付宝通用模型
Map<String, Object> ret = new HashMap<>();
//一级channel
JSONObject acc_p = new JSONObject();
acc_p.put("channel", "ALIPAYAPP");
//biz_content层级(关键参数)
Map bizModel = new HashMap<>();
//将一级channel传入
bizModel.put("access_params", acc_p);
//唯一标识位,此处传入用户卡号
bizModel.put("external_agreement_no", cardNo);
//固定参数
bizModel.put("personal_product_code", "GENERAL_WITHHOLDING_P");
bizModel.put("sign_scene", "INDUSTRY|MULTIMEDIA");
//拼接通用参数
Map request = new HashMap<>();
request.put("app_id", config.getQrAppId());
//将biz_content层级转化为JSON格式传入
request.put("biz_content", JSONUtil.toJSONString(bizModel));
Date date = DateUtil.getAsiaDate();
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(date);
request.put("timestamp",dateString);
//request.put("timestamp","2019-06-12 14:39:02");
request.put("sign_type", config.getSignType());
request.put("charset", config.getCharset());
request.put("method", "alipay.user.agreement.page.sign");
request.put("notify_url", config.getContractNotiyfyUrl());
//request.put("return_url", config.getContractReturnUrl());
request.put("version", "1.0");
//将拼好的map按ASC2码进行排序,并以key,value进行拼接
String toSignStr = UrlUtil.getUrlParamsByMapAli(request);
String sign = null;
//将拼接好的字符串toSignStr进行RSA2自签名
sign = AlipaySignature.rsa256Sign(toSignStr,config.getQrPrivateKey(), "utf-8");
//将签名进行encode处理后再次拼接在toSignStr后面
String orderStr = toSignStr+"&sign="+URLEncoder.encode(sign, "UTF-8");;
//再对拼接好的完整字符串orderStr进行一次encode处理
orderStr = URLEncoder.encode(orderStr, "UTF-8");
//System.out.println("生成signStr:"+orderStr);
ret.put("returnCode", "0");
ret.put("sdkParams", orderStr);
return ret;
}
返回的map中sdkParams就是拼好的SDK,传回前台如何使用就看你们自行调用的接口了。