后台支付开发2

  1. 直接在后台发送请求的的方法
    1. 发送Form格式,参考:一
    2. 发送Json格式
  2. 页面Form发送请求的,就是Form表单提交的方式,参考:二

    一:发送POST请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

/**
* op 商户对象
* userName 用户名
* pay_amount 支付金额
* clientIp 客户度ip
*/
public String payByKyf(OnlinePayment op, String userName, String pay_amount, String pay_callbackurl){
//平台号
String platFormType = op.getPlatformtype();
// 商户号
String pay_memberid = op.getMerchatno();
//订单号
String pay_orderid = this.generateOrderNo(userName, Double.parseDouble(pay_amount), platFormType, pay_memberid);
// 密钥
String key = onlinePaymentService.findParamMap(pay_memberid, platFormType).get("key");
//支付时间
String pay_applydate = DateUtil.formatDateForStandard(new Date());

/**
* 签名
*/
Map<String,String> paramsForSign = new TreeMap<String, String>();
paramsForSign.put("pay_memberid", pay_memberid); // 商户账号
paramsForSign.put("pay_bankcode", "902"); // 类型ID,902代表银联扫码
paramsForSign.put("pay_orderid", pay_orderid); // 商户订单号
paramsForSign.put("pay_amount", pay_amount); // 金额
paramsForSign.put("pay_notifyurl", "http://www.yanganlin.com:8082/notify/payNotify.html"); //后台异步回调
paramsForSign.put("pay_applydate", pay_applydate); //下单时间
paramsForSign.put("pay_callbackurl", pay_callbackurl); //页面异步回调

/**
* 按照开发文档的要求,进行签名,
* 签名的时候需要key的参与,但是后面发送请求的时候,就需要生成后的签名,但是不需要key
*/
String sign = KyfPay.genSign(paramsForSign, key);

/**
* 这是要发送的最终参数
*/
Map<String, String> paramsForQrCode = new TreeMap<String, String>();
paramsForQrCode.putAll(paramsForSign);
paramsForQrCode.put("pay_md5sign", sign);

//日志打印
printParm(platFormType + ":qrcode", paramsForQrCode); // log param

/**
* 1.:银联支付的接口(文档里有),2:封装的参数
* 发送请求
* 取得json, 并解析qrcodepay_callbackurl
*/
String jsonString = HttpUtils.post(op.getShoppingMallURI(), paramsForQrCode);
Map<String, Object> rspMap = (Map<String, Object>) JsonMapper.fromJsonString(jsonString, HashMap.class);

//打印日志
printParm2(platFormType, rspMap);

// 解析返回的数据
if (!"1".equals(rspMap.get("code").toString())) {
return this.errorResult("[提示]" + rspMap.get("code") + ":" + rspMap.get("desc"));
}

//payUrl 是返回到页面的在<script>window.location.href="payUrl"</>里要跳转的url
String payUrl = rspMap.get("qrcode").toString();
if (StringUtils.isBlank(payUrl)) {
return this.errorResult("[提示]支付方未产生URL");
}
return payUrl;
}

大致意思是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public String send(String url,String md5Str,Map<String,String> map) {
HttpClient client = new HttpClient();
PostMethod myPost = new PostMethod(url);
String responseString = null;
try {
String tradeNo = String.valueOf(new Date().getTime());
myPost.addRequestHeader("Accept", "application/json");
myPost.addRequestHeader("Content-Type", "application/x-www-form-urlencoded");

myPost.setParameter("key", map.get("key"));
myPost.setParameter("method", map.get("method"));
myPost.setParameter("trade_no", map.get("trade_no"));
myPost.setParameter("title", map.get("title"));
myPost.setParameter("memo", map.get("memo"));
myPost.setParameter("money", map.get("money")); //订单金额,单位为分
myPost.setParameter("platform", map.get("platform")); //
myPost.setParameter("mobile", map.get("mobile")); //
myPost.setParameter("timestamp", map.get("timestamp"));
myPost.setParameter("notify", map.get("notify"));
myPost.setParameter("redirect", map.get("redirect"));
myPost.setParameter("sign", md5Str);
int statusCode = client.executeMethod(myPost);
if (statusCode == HttpStatus.SC_OK) {
responseString = myPost.getResponseBodyAsString();
if (responseString == null || responseString.equals("")) {
log.info(GamePlatform.SUNBET.name() + " API 接口出现问题!");
return null;
}
} else {
log.info("Response Code: " + statusCode+" 返回信息:"+myPost.getResponseBodyAsString());
return null;
}
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
return this.errorResult("[提示]签名失败,请重新尝试");
} finally {
myPost.releaseConnection();
}
return responseString;
}

二:页面Form表单形式提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
* op 商户对象
* userName 用户名
* pay_amount 支付金额
* clientIp 客户度ip
*/
public Map payByKyfwap(OnlinePayment op, String userName, String pay_amount, String pay_callbackurl){

//平台号
String platFormType = op.getPlatformtype();
// 商户号
String pay_memberid = op.getMerchatno();
//订单号
String pay_orderid = this.generateOrderNo(userName, Double.parseDouble(pay_amount), platFormType, pay_memberid);
// 密钥
String key = onlinePaymentService.findParamMap(pay_memberid, platFormType).get("key");
//支付时间
String pay_applydate = DateUtil.formatDateForStandard(new Date());

/**
* 签名
*/
paramsForSign.put("pay_memberid", pay_memberid); // 商户账号
paramsForSign.put("pay_bankcode", "902"); // 类型ID,902代表银联扫码
paramsForSign.put("pay_orderid", pay_orderid); // 商户订单号
paramsForSign.put("pay_amount", pay_amount); // 金额
paramsForSign.put("notifyurl", "www.yanganlin.com/notify/payNotify.html");//后台异步回调
paramsForSign.put("pay_applydate", pay_applydate); //下单时间
paramsForSign.put("pay_callbackurl", pay_callbackurl); //页面异步回调

/**
* 按照开发文档的要求,进行签名,
* 签名的时候需要key的参与,但是后面发送请求的时候,就需要生成后的签名,但是不需要key
*/
String sign = KyfPay.genSign(paramsForSign, key);

/**
* 这里不是发送post请求,而是返回到页面
*/
Map<String, String> resultMap = new TreeMap<String, String>();
resultMap.putAll(paramsForSign);
resultMap.put("pay_md5sign", sign);
resultMap.put("inteface", op.getShoppingMallURI());
return resultMap;
}

返回到页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="dfh.model.Users"%>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body onLoad="document.dinpayForm.submit();">
<body>
<form method="post" action="${resultMap.inteface}" target="_parent">
<input type="hidden" name="P_UserId" value="${resultMap.pay_memberid}" />
<input type="hidden" name="P_OrderId" value="${resultMap.pay_bankcode}" />
<input type="hidden" name="P_ChannelId" value="${resultMap.pay_orderid}" />
<input type="hidden" name="P_FaceValue" value="${resultMap.pay_amount}" />
<input type="hidden" name="P_CardId" value="${resultMap.pay_notifyurl}" />
<input type="hidden" name="P_CardPass" value="${resultMap.pay_callbackurl}"/>
</form>
</body>
</html>