标签:支付宝
一、前言
在接入支付宝接口之前,需要在支付宝官网进行应用注册和实名认证,地址不再贴出。
在此,贴出支付宝开放平台文档地址:https://docs.open.alipay.com/58/103585/
在这个地址中,详细介绍了如何接入支付宝接口
二、发起请求
支付宝的签名方式等不做详细介绍,在开发文档中有详细说明,笔者建议:编码格式请使用UTF-8。
接下来的介绍中,主要贴出代码(代码仅供参考)
在贴出代码之前,首先大致了解一下如何发起支付请求:
第一步:组装阿里参数
该步骤组装的参数来自于商户系统的支付信息,包括支付类型、商品名称等信息。值得注意的是,支付宝要求传入两个url,分别是异步通知和同步通知,这两个接口用于支付宝向商户系统反馈支付结果,同步为GET请求,异步为POST请求,详细用法将在下一篇做介绍。
第二步:过滤参数
该步骤作用是将上述组装的参数,value为空的键值对去掉,同时去掉sign和sign_type参数。
第三步:生成签名
该步骤对应代码使用MD5加密方式
第四步:重新组装
将生成的签名加入盛放参数的map中
第五步:获取html
获取到的html是一个form表单,action为支付宝的网关:https://mapi.alipay.com/gateway.do?input_charset=编码格式,表单内容为input标签的集合,例如<input type="hidden",name="参数名称",value="参数值" >,将该表单显示在页面上,会跳转至支付宝网关,显示支付宝扫码页面,待用户扫码后,发起支付请求完成
接下来贴出代码:
该部分代码为最上层代码,获取的html可返回给页面直接使用
Map<String, String> sParaTemp = new HashMap<String, String>(); sParaTemp.put("service", AlipayConfig.serivce);//接口服务----即时到账 sParaTemp.put("partner", AlipayConfig.partner);//支付宝PID sParaTemp.put("_input_charset", AlipayConfig.input_charset);//统一编码 sParaTemp.put("payment_type", payment_type);//支付类型 sParaTemp.put("notify_url", notify_url);//异步通知页面 sParaTemp.put("return_url", return_url);//页面跳转同步通知页面 sParaTemp.put("seller_email", seller_email);//卖家支付宝账号 sParaTemp.put("out_trade_no", out_trade_no);//商品订单编号 sParaTemp.put("subject", subject);//商品名称 sParaTemp.put("total_fee", total_fee);//价格 sParaTemp.put("body", body); sParaTemp.put("paymethod", AlipayConfig.paymethod); sParaTemp.put("defaultbank", defaultBank); sParaTemp.put("show_url", show_url); sParaTemp.put("anti_phishing_key", anti_phishing_key); sParaTemp.put("exter_invoke_ip", exter_invoke_ip); String html= AlipaySubmit.buildRequest(sParaTemp,"post","确认");
public static String buildRequest(Map<String, String> sParaTemp, String strMethod, String strButtonName) { Map<String, String> sPara = buildRequestPara(sParaTemp);//第二步+第三步:过滤参数 List<String> keys = new ArrayList(sPara.keySet()); StringBuffer sbHtml = new StringBuffer(); sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"https://mapi.alipay.com/gateway.do?_input_charset=" + AlipayConfig.input_charset + "\" method=\"" + strMethod + "\">"); for(int i = 0; i < keys.size(); ++i) { String name = (String)keys.get(i); String value = (String)sPara.get(name); sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>"); } sbHtml.append("<input type=\"submit\" value=\"" + strButtonName + "\" style=\"display:none;\"></form>"); sbHtml.append("<br><br>跳转中,请稍候..."); sbHtml.append("<script>document.forms[‘alipaysubmit‘].submit();</script>"); return sbHtml.toString(); }
buildRequestPara()用于过滤参数和生成签名:
private static Map<String, String> buildRequestPara(Map<String, String> sParaTemp) { Map<String, String> sPara = AlipayCore.paraFilter(sParaTemp); String mysign = buildRequestMysign(sPara); sPara.put("sign", mysign); sPara.put("sign_type", AlipayConfig.sign_type); return sPara; }
第二步:paraFilter()过滤掉value的键值对和sign、sign_type:
public static Map<String, String> paraFilter(Map<String, String> sArray) { Map<String, String> result = new HashMap(); if (sArray != null && sArray.size() > 0) { Iterator var3 = sArray.keySet().iterator(); while(var3.hasNext()) { String key = (String)var3.next(); String value = (String)sArray.get(key); if (value != null && !value.equals("") && !key.equalsIgnoreCase("sign") && !key.equalsIgnoreCase("sign_type")) { result.put(key, value); } } return result; } else { return result; } }
第三步:buildRequestMysign()生成签名:
public static String buildRequestMysign(Map<String, String> sPara) { String prestr = AlipayCore.createLinkString(sPara); String mysign = ""; if (AlipayConfig.sign_type.equals("MD5")) { mysign = MD5.sign(prestr, AlipayConfig.key, AlipayConfig.input_charset); } return mysign; }
标签:支付宝
原文地址:http://11864647.blog.51cto.com/11854647/1982488