境外⽀付宝接⼝对接--⽀付接⼝
近期公司需要提供⽀付宝⽀付,对于⼀个没有联调过⽀付接⼝的我来说可谓是头痛的死.还有找到⽀付宝境外接⼝的技术⼈员, 不管咋地,多谢⽀付宝技术⼈员的解答.
你可以到⽹上找客户叫他们给你旺旺号码发demo给你:
⽀付宝跨境⽀付PC⽹站接⼝: /others/create_forex_trade.zip
⽀付宝跨境⽀付⽆线⽹站(H5/WAP)接⼝:
⽀付宝跨境⽀付APP接⼝:
请求参数可以去查看pdf⽂档,记住不要把签名和签名类型这两个参数,添加到⽣成要签名的集合⾥⾯去--->⽣成求情url:请求参数是什么意思,请查看相关pdf,改⽂档⾥⾯描述了请求参数和请求URL的格式以及返回的code含义.请求接⼝/⽀付宝⽹关可以去询问⽀付宝相关技术⽀持,我这⾥就不贴出来了
1/**
2 * 创建请求⽀付宝的URL
3 * @param paygateway ⽀付宝连接
4 * @param rvice ⽀付宝服务接⼝
5 * @param sign_type 签名⽅式(加密类型)
6 * @param out_trade_no 境外商户交易号
7 * @param input_chart 编码
8 * @param partner 境外商户⽀付宝ID
9 * @param key
10 * @param body 描述
11 * @param total_fee 交易⾦额
12 * @param currency 币种
13 * @param subject 商品名称
14 * @param notify_url⽀付成功的回调路径个⼈觉得notify_url与return_url都相差⽆⼏
高中生出国留学条件15 * @param return_url⽀付成功的回调路径
16 * @return
17*/
18public static String createUrl(String paygateway, String rvice, String sign_type,
19 String out_trade_no,String input_chart,
20 String partner,String key,
21 String body, String total_fee, String currency,
22 String subject ,String notify_url,
23 String return_url) {
24
25 Map<String,Object> params = new HashMap<String,Object>();
26 params.put("rvice", rvice);
27 params.put("partner", partner);
28 params.put("subject", subject);
29 params.put("body", body);
30 params.put("out_trade_no", out_trade_no);
中韩互译在线翻译器31 params.put("rmb_fee", total_fee);//表⽰商品的标价是⼈民币,具体参考pdf
32// params.put("total_fee", total_fee);
33 params.put("currency",currency);
34 params.put("return_url", return_url);//这两个url是需要外⽹能够访问的
35 params.put("notify_url", notify_url);//需要外⽹能够访问的
36 params.put("_input_chart", input_chart);全国大学生四六级考试官网
37
38 String prestr = "";
39
40 prestr = prestr + key;
41//System.out.println("prestr=" + prestr);
42
43 String sign = DigestUtils.md5Hex(getContent(params, key));//⽣成签名
44 String parameter = "";
45 parameter = parameter + paygateway;
46
47 List<Object> keys = new ArrayList<Object>(params.keySet());
48for (int i = 0; i < keys.size(); i++) {
49try {
50 parameter = parameter + (i) + "="
51 + de((String) ((i)), input_chart) + "&";
52 } catch (UnsupportedEncodingException e) {
53
54 e.printStackTrace();
55 }
56 }
57
58 parameter = parameter + "sign=" + sign + "&sign_type=" + sign_type;
59
60return parameter;
61
62 }
1/**
2 * 把集合拼接成请求参数
3 * @param params 请求参数集合
4 * @param privateKey 公司key
5 * @return
6*/
7private static String getContent(Map params, String privateKey) {
8 List keys = new ArrayList(params.keySet());
9 Collections.sort(keys);
ipv10
11 String prestr = "";
12
13for (int i = 0; i < keys.size(); i++) {
14 String key = (String) (i);
15 String value = (String) (key);
16
17if (i == keys.size() - 1) {
18 prestr = prestr + key + "=" + value;
19 } el {
20 prestr = prestr + key + "=" + value + "&";
21 }
22 }
23// String p = prestr + privateKe+"&forex_biz=\"FP\"";
24 String p = prestr+privateKey;
25 System.out.println(p);
26return p;
27 }
拿到这个请求url你可以⽤A标签或者⽤httpclient访问httpclient可以查看境外⽀付宝报关接⼝对接博客.(有些情况是不能使⽤httpclient,⽐如使⽤国内的⽀付宝即时到账功能不能使⽤httpclient)
⽀付宝⽀付成功后回调的URL,⽀付成功的消息都在请求⾥⾯:trade_status状态等于TRADE_FINISHED的时候才算⽀付成功(这⾥是return_url,适⽤于提供给⽤户显⽰,notify_url适⽤于做⾃⼰的业务逻辑,记住,如果成功了要先⽀付宝发送成的消息,看下⾯的return_url)
public ModelAndView payResult(HttpServletRequest request){
ModelAndView model = new ModelAndView();
存在即合理英文
Map<String,String> params = new HashMap<String,String>();
@SuppressWarnings("rawtypes")
Map requestParams = ParameterMap();
for (@SuppressWarnings("rawtypes")
Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) ();
String[] values = (String[]) (name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
英语46级成绩查询
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
try {
valueStr = new Bytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
params.put(name, valueStr);
}
//乱码解决,这段代码在出现乱码时使⽤。如果mysign和sign不相等也可以使⽤这段代码转化
try {
//获取⽀付宝的通知返回参数,可参考技术⽂档中页⾯跳转同步通知参数列表(以下仅供参考)//
//订单外币⾦额
String total_fee = new Parameter("total_fee").getBytes("ISO-8859-1"),"UTF-8");
//清算币种
String currency = new Parameter("currency").getBytes("ISO-8859-1"),"UTF-8");
//商户订单号
String out_trade_no = new Parameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
复试技巧
//⽀付宝交易号
String trade_no = new Parameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
System.out.println("⽀付宝交易号:___"+trade_no);
//交易状态
String trade_status = new Parameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
System.out.println("交易状态:___"+trade_status);
if(StringUtils.isNotBlank(trade_status) && "TRADE_FINISHED".equals(trade_status)){
model.tViewName("pay/pay_success");
model.addObject("message", "⽀付成功!");
AlipayNotify.verify(params);//这个是demo⾥⾯的⽅法, 下载上⾯的demo就有该类,就不贴出来了
String responTxt = "true";
("notify_id") != null) {
String notify_id = ("notify_id");
responTxt = AlipayNotify.verifyRespon(notify_id);
}
String sign = "";
("sign") != null) {
sign = ("sign");
}
boolean isSign = SignVeryfy(params, sign);
//写⽇志记录(若要调试,请取消下⾯两⾏注释)
String sWord = "responTxt=" + responTxt + "\n isSign=" + isSign + "\n 返回回来的参数:" + ateLinkString(params);
Map<String,String> paramMap = new HashMap<String,String>();
paramMap.put("orderNu", out_trade_no);
paramMap.put("payNu", trade_no);首饰设计培训
orderService.updateAliOrderStatus(paramMap);
// PrintWriter out = Writer();
// out.print("success");//这段代码是在notify_url的地址中,我这⾥是没有贴notify_url了
} el {
model.tViewName("pay/pay_fail");
model.addObject("message", "⽀付失败!");
// PrintWriter out = Writer();//这段代码是在notify_url的地址中,我这⾥是没有贴notify_url了
//out.print("fail");
北京艺术高中}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return model;
}
调⽤:
1// String paygateway = "/gateway.do?"; //⽀付宝测试环境
2 String paygateway = "/gateway.do?"; // ⽀付宝正式环境
3 String rvice = "create_forex_trade";//接⼝名称
4 String sign_type = "MD5";//签名⽅式
5 String out_trade_no = OrderCode(); //本地系统订单号()
6 String input_chart = "utf-8";
7// String partner = "2088101122136241"; //测试环境pid
8 String partner = ""; //pid
中日在线翻译器9// String key = "760bdzec6y9goq7ctyx96ezkz78287de"; //测试环境的key
10 String key = ""; //商户key
11 String body = "";//商品描述
12if(orderDetails != null && orderDetails.size() > 1){
13 body = (0).getProductName()+"等多件"; //trade description
14 } el {
15 body = (0).getProductName(); //trade description
16 }
17// String total_fee = "1"; //range is 0.01~1000000.00
18 String total_fee = (Session().getAttribute("sumPriceForAli");//⽀付⾦额
19 String currency = "USD";//币种
20 String subject = "";//商品名称
21if(orderDetails != null && orderDetails.size() > 1){
22 subject= (0).getProductName()+"等多件"; //
23 } el {
24 subject= (0).getProductName(); //
25 }
26 String notify_url = ""; //异步通知,可以理解为后台处理逻辑程序
27 String return_url = "/uec/pay/payResult"; // 同步通知,可以理解为前台页⾯显⽰给⽤户看的
28 String ateUrl(paygateway,rvice,sign_type,out_trade_no,input_chart,partner,key,body,total_fee,currency,subject,notify_url,return_url);这段代码,我是写在jsp⾥⾯的, 当然可以改写,Payment类的createUrl⽅法就是第⼀段代码,其他验证签名的⽅法和类可以下载上⾯链接。