一、前言

在接入支付宝接口之前,需要在支付宝官网进行应用注册和实名认证,地址不再贴出。

在此,贴出支付宝开放平台文档地址: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=newHashMap<String,String>();sParaTemp.put("service",AlipayConfig.serivce);//接口服务----即时到账sParaTemp.put("partner",AlipayConfig.partner);//支付宝PIDsParaTemp.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);Stringhtml=AlipaySubmit.buildRequest(sParaTemp,"post","确认");

publicstaticStringbuildRequest(Map<String,String>sParaTemp,StringstrMethod,StringstrButtonName){Map<String,String>sPara=buildRequestPara(sParaTemp);//第二步+第三步:过滤参数List<String>keys=newArrayList(sPara.keySet());StringBuffersbHtml=newStringBuffer();sbHtml.append("<formid=\"alipaysubmit\"name=\"alipaysubmit\"action=\"https://mapi.alipay.com/gateway.do?_input_charset="+AlipayConfig.input_charset+"\"method=\""+strMethod+"\">");for(inti=0;i<keys.size();++i){Stringname=(String)keys.get(i);Stringvalue=(String)sPara.get(name);sbHtml.append("<inputtype=\"hidden\"name=\""+name+"\"value=\""+value+"\"/>");}sbHtml.append("<inputtype=\"submit\"value=\""+strButtonName+"\"style=\"display:none;\"></form>");sbHtml.append("<br><br>跳转中,请稍候...");sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>");returnsbHtml.toString();}

buildRequestPara()用于过滤参数和生成签名:

privatestaticMap<String,String>buildRequestPara(Map<String,String>sParaTemp){Map<String,String>sPara=AlipayCore.paraFilter(sParaTemp);Stringmysign=buildRequestMysign(sPara);sPara.put("sign",mysign);sPara.put("sign_type",AlipayConfig.sign_type);returnsPara;}

第二步:paraFilter()过滤掉value的键值对和sign、sign_type:

publicstaticMap<String,String>paraFilter(Map<String,String>sArray){Map<String,String>result=newHashMap();if(sArray!=null&&sArray.size()>0){Iteratorvar3=sArray.keySet().iterator();while(var3.hasNext()){Stringkey=(String)var3.next();Stringvalue=(String)sArray.get(key);if(value!=null&&!value.equals("")&&!key.equalsIgnoreCase("sign")&&!key.equalsIgnoreCase("sign_type")){result.put(key,value);}}returnresult;}else{returnresult;}}

第三步:buildRequestMysign()生成签名:

publicstaticStringbuildRequestMysign(Map<String,String>sPara){Stringprestr=AlipayCore.createLinkString(sPara);Stringmysign="";if(AlipayConfig.sign_type.equals("MD5")){mysign=MD5.sign(prestr,AlipayConfig.key,AlipayConfig.input_charset);}returnmysign;}