前言
这篇文章主要讲诉系统调用支付宝手机网页即时到账交易接口跳转到支付宝收银台。
上篇文章地址:支付宝手机网页即时到账接口(2)之授权接口请求。
这是第一篇文章结尾调用交易接口的图解。
交易接口请求参数说明
1.含义
- 请求参数是商户在与支付宝进行数据交互时,提供给支付宝的请求数据,以便支付宝根据这些数据进一步处理。
2.交易接口请求参数列表
从上面的图片可以看到参数比较多,这边简单介绍下(注:下面没有写出字符长度)。
- service=alipay.wap.auth.authAndExecute
- 授权接口名称(固定)
- format=xml
- 请求参数固定
- v=2.0
- 接口版本号(固定)。注当前版本,以后说不定会更新
- partner=2088000000000000
- 合作者身份ID(开通支付宝商家服务后,支付宝会提供)
- req_id=20150512203545
- 请求号(必须唯一,可以用当前时间)
- sec_id=MD5
- 签名方式(MD5、0001(RSA))。本篇是用MD5
- sign=VRVr7adPfsHblFjiBkGWryhKI
- 对请求或响应中参数签名后的值。
- req_data
- 示例
<auth_and_execute_req>
<request_token>201008309e298cf01c58146274208eda1e4cdf2b</request_token>
</auth_and_execute_req>
3.样例
http://wappaygw.alipay.com/service/rest.htm?req_data=<auth_and_execute_req><request_token>201008309e298cf01c58146274208eda1e4cdf2b</request_token></auth_and_execute_req>&service=alipay.wap.auth.authAndExecute&sec_id=0001&partner=2088101000137799&sign=LdXbwMLug8E4UjfJMuYv2KoD5X5F3vHGQsQbZ/rdEQ3eaN4FPal7rhsbZZ/+ZUL1kAKzTQSDdMk87MEWtWO1Yq6rhnt2Tv8Hh6Hb16211VXKgbBCpq861+LopRwegPbGStcwBuAyE4pi6fYlJ6gxzL4tMyeLe+T5XZ0RKRUk00U=&format=xml&v=2.0
代码示例
交易bean
public class AlipayTrade {
//接口名称
private final static String service = "alipay.wap.auth.authAndExecute";
//请求格式参数格式
private final static String format = "xml";
//接口版本号
private final static String v = "2.0";
//合作者身份id
public String partner = "2088000000000000";//填写从支付宝得到的id
//签名方式
private final static String secId = "MD5";
//签名
private String sign;
//业务参数
//请求业务参数
private String reqData;
private String inputCharset = "utf-8";
//授权令牌
private String requestToken;
private String key = "";
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getRequestToken() {
return requestToken;
}
public void setRequestToken(String requestToken) {
this.requestToken = requestToken;
this.reqData = "<auth_and_execute_req><request_token>" + requestToken + "</request_token></auth_and_execute_req>";
}
public String getService() {
return service;
}
public String getFormat() {
return format;
}
public String getInputCharset() {
return inputCharset;
}
public void setInputCharset(String inputCharset) {
this.inputCharset = inputCharset;
}
public String getV() {
return v;
}
public String getPartner() {
return partner;
}
public String getSecId() {
return secId;
}
public String getSign() {
return sign;
}
public String getReqData() {
return reqData;
}
public void setSign(String sign) {
this.sign = sign;
}
}
将交易信息输出到页面中
public AlipayTrade trade(String token){
AlipayTrade alipayTrade = new AlipayTrade();
alipayTrade.setRequestToken(token);//设置token
//2.获取sign签名
Map<String, String> param2 = getTradeParam(alipayTrade);
// 拼接后字符串
String prestr2 = AliPayUtils.createLinkString(param2);
alipayTrade.setSign(getSign(prestr2, alipayTrade.getKey(), alipayTrade.getInputCharset()));
return alipayTrade;
}
getTradeParam(alipayTrade)代码块
private static Map<String, String> getTradeParam(AlipayTrade alipayTrade) {
Map<String, String> param = new HashMap<String, String>();
param.put("service", alipayTrade.getService());
param.put("partner", alipayTrade.getPartner());
param.put("_input_charset", alipayTrade.getInputCharset());
param.put("sec_id", alipayTrade.getSecId());
param.put("format", alipayTrade.getFormat());
param.put("v", alipayTrade.getV());
param.put("req_data", alipayTrade.getReqData());
return AliPayUtils.paraFilter(param);
}
工具类PayUtils.paraFilter(param)
- 去掉空值与签名后的新签名参数组
public static Map<String, String> paraFilter(Map<String, String> sArray) {工具类PayUtils.createLinkString(param)
Map<String, String> result = new HashMap<String, String>();
if (sArray == null || sArray.size() <= 0) {
return result;
}
for (String key : sArray.keySet()) {
String value = sArray.get(key);
if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
|| key.equalsIgnoreCase("sign_type")) {
continue;
}
result.put(key, value);
}
return result;
}
- 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼凑成字符串
public static String createLinkString(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}
代码块getSign(prestr, alipayAuth.getKey(), alipayAuth.getInputCharset())
- 签名字符串
private static String getSign(String text, String key, String input_charset) {
text = text + key;
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
}
交易页面
<%@page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>
<form id="alipaysubmit" name="alipaysubmit" action="http://wappaygw.alipay.com/service/rest.htm?_input_charset=${trade.inputCharset}" method="get">
<input type="hidden" name="sign" value="${trade.sign}"/>
<input type="hidden" name="sec_id" value="${trade.secId}"/>
<input type="hidden" name="v" value="${trade.v}"/>
<input type="hidden" name="_input_charset" value="${trade.inputCharset}"/>
<input type="hidden" name="req_data" value="${trade.reqData}"/>
<input type="hidden" name="service" value="${trade.service}"/>
<input type="hidden" name="partner" value="${trade.partner}"/>
<input type="hidden" name="format" value="${trade.format}"/>
<input type="submit" value="确认" style="display:none;">
</form>
<script>document.forms['alipaysubmit'].submit();</script>
</body>
</html>