文章目录

  • 术语和缩略语
  • 1.必要条件
  • 1.1企业或商户的支付宝账户
  • 1.2企业或商户的合作者身份PID
  • 1.3企业或商户的安全校验码KEY
  • 1.4企业或商户的RSA密钥
  • 1.5项目域名
  • 2.集成环境
  • 3.集成步骤
  • 3.1第一步:编写购物车结算JSP
  • 3.2第二步:编写结算功能按钮
  • 3.3第三步:建立参数数组
  • 3.4第四步:建立支付请求
  • 3.5第五步:校验参数信息
  • 3.6页面展示
  • 4.支付问题
  • 5.参考资料
  • 5.1RSA和MD5签名文件总结
  • 5.2DEMO文件下载
  • 5.2.1 使用MD5签名版本
  • 5.2.2 使用RSA签名版本


术语和缩略语

术语和缩略语

解释

partner

合作者身份PID,以2088开头由16位纯数字组成

seller_id

收款支付宝帐号,一般与partner相同

private_key

商户的私钥,需要PKCS8格式

alipay_public_key

支付宝的公钥,生成商户私钥后可查看

notify_url

服务器异步通知页面路径

return_url

页面跳转同步通知页面路径

sign_type

签名方式:RSA、MD5

log_path

日志文件路径

input_charset

字符编码格式 目前支持 gbk 或 utf-8

payment_type

支付类型 1:商品购买 2.服务购买 3.网络拍卖 4.捐赠

service

调用接口名称:付款create_direct_pay_by_user 退款refund_fastpay_by_platform_pwd

anti_phishing_key

防钓鱼时间戳

exter_invoke_ip

客户端的IP地址

key

MD5密钥,安全检验码,由数字和字母组成的32位字符串

1.必要条件

项目集成支付宝即时到账支付功能需求内容:
		① 已签约企业或商户的支付宝账户
		② 已签约企业或商户的合作者身份PID(以2088开头由16位纯数字组成)
		③ 已签约企业或商户的安全校验KEY(已数字和字母组成的32位MD5密钥)
		④ 已签约企业或商户的RSA密钥
		⑤ 项目域名
		 以上需求必须获取至少4项(3、4可选1项,第三项使用MD5签名使用,第四项
	使用RSA签名使用),无任何一项则无法进行功能开发。
		 已签约的企业或商户登录支付宝企业版,点击[商户服务]/[我的商家服务]可
	查询上述需求内容的前4项。

1.1企业或商户的支付宝账户

企业或商户的支付宝账户即为支付宝登录账户,也可登录点击[商户服务]后在头像旁取得。
   支付宝账户形式:邮箱、手机号、淘宝会员名。
   例:邮箱:123456789@qq.com
    手机:13912345678
    淘宝会员名:我是淘宝会员

1.2企业或商户的合作者身份PID

企业或商户的合作者身份PID是在与支付宝签约后生成的身份数字,代表着企业或商户的身份。
   合作者身份PID形式:以2088开头的16位纯数字
   例:2088411668540912

1.3企业或商户的安全校验码KEY

企业或商户的安全校验码KEY是在与支付宝签约后生成的安全校验规则,保障企业或商户的账号安全。
   安全校验码形式:以数字和字母组成的32位MD5密钥
   例:65s2e2hd587vcw46f9g52eg0ks62dx97j1si

1.4企业或商户的RSA密钥

企业或商户的RSA密钥是在与支付宝签约完成后下载密钥生成工具生成,分为Windows版和MAC OSX版。
下载地址及生成方法:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1

1.5项目域名

项目开发完成上线后,用户可以使用的外网登陆地址。支付宝集成使用展示支付宝产品信息等内容。

2.集成环境

JAR包使用DEMO中WebRoot-WEB-INF-lib下的jar包即可。
使用JDK/JRE1.5及以上版本。

3.集成步骤

编写展示商品信息、购物车结算的JSP页面(3.1) -> 编写结算功能(3.2) ->获取购物车list中的商品信息(3.3) -> 将参数和用户信息组成数组建立支付请求(3.4) -> 校验参数数组支付(3.5)

3.1第一步:编写购物车结算JSP

在WebRoot文件夹下新建文件index.jsp中编写JSP页面商品列表、购物车列表及操作按钮排版,并将购物车结算时要将购物车中所有商品的价格进行汇总并获取订单号、订单名称等信息(存储于form表单中):

<form action="alipayapi.jsp" method="post" target="_blank" id="alipay_arry" style="display:none;">
		<!-- 唯一订单号(必填) -->
		<input type="text" name="orderId" id="orderId" />
		<!-- 订单名称(必填) -->
		<input type="text" name="orderName" id="orderName" />
		<!-- 总计金额(必填) -->
		<input type="text" name="orderMoney" id="orderMoney" />
		<!-- 商品描述(可为空) -->
		<input type="text" name="orderDesc" id="orderDesc" />
		<!-- 展示地址(可删除) -->
		<input type="text" name="orderUrl" id="orderUrl" /> 
	</form>

3.2第二步:编写结算功能按钮

结算按钮使用JQuery方法

<a href="#" class="c_sub" onclick="count_order(this)">结算</a>

JQuery获取订单全部信息、计算购物车商品总价,提交form表单

function count_order(){
		$("#orderId").val("PAY - "+Math.ceil(Math.random()*100000));
		$("#orderName").val("商品支付");
		$("#orderMoney").val(getPrice());
		$("#orderDesc").val("商品描述");
		$("#orderUrl").val("http://www.tanzhouedu.com");
		document.getElementById("alipay_arry").submit();
	}
	
	function getPrice(){
		var tprice = 0;
		$("#c_ul").find("li").each(function(){
			tprice += $(this).find(".c_pr").text()*1;
		});
		alert("结算总金额:"+tprice);
		return tprice;
	}

3.3第三步:建立参数数组

将form传递的订单参数和AlipayConfig.java中填写的商户信息建立成一个参数数组。(alipayapi.jsp)

Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("service", AlipayConfig.service);//调用的接口create_direct_pay_by_user
sParaTemp.put("partner", AlipayConfig.partner);//合作这身份PID
sParaTemp.put("seller_id", AlipayConfig.seller_id);//收款支付宝账号,一般与partner相同
sParaTemp.put("_input_charset", AlipayConfig.input_charset);//字符集编码格式 GBK或UTF-8
sParaTemp.put("payment_type" , AlipayConfig.payment_type);//支付类型 1:商品购买 2.服务购买  3.网络拍卖  4.捐赠
sParaTemp.put("notify_url", AlipayConfig.notify_url);//服务器异步通知页面路径
sParaTemp.put("return_url", AlipayConfig.return_url);//页面跳转同步通知页面路径
sParaTemp.put("anti_phishing_key", AlipayConfig.anti_phishing_key);//防钓鱼时间戳
sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip);//客户端的IP地址 非局域网的外网IP地址
sParaTemp.put("out_trade_no", out_trade_no);//商户订单号
sParaTemp.put("subject", subject);//订单名称
sParaTemp.put("total_fee", total_fee);//付款金额
sParaTemp.put("body", body);//商品描述

3.4第四步:建立支付请求

将第三步中建立的参数数组使用POST/GET方式建立支付请求(alipayapi.jsp):

//建立请求
String sHtmlText = AlipaySubmit.buildRequest(sParaTemp,"post","确认");
out.println(sHtmlText);

3.5第五步:校验参数信息

验证参数信息的准确性,确认无误后跳转至支付宝手机扫码或支付/网页登陆支付宝账号登陆。(AlipaySubmit.java)

/**
     * 建立请求,以表单HTML形式构造(默认)
     * @param sParaTemp 请求参数数组
     * @param strMethod 提交方式。两个值可选:post、get
     * @param strButtonName 确认按钮显示文字
     * @return 提交表单HTML文本
     */
    public static String buildRequest(Map<String, String> sParaTemp, String strMethod, String strButtonName) {
        //待请求参数数组
        Map<String, String> sPara = buildRequestPara(sParaTemp);
        List<String> keys = new ArrayList<String>(sPara.keySet());

        StringBuffer sbHtml = new StringBuffer();

        sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + ALIPAY_GATEWAY_NEW
                      + "_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 + "\"/>");
        }

        //submit按钮控件请不要含有name属性
        sbHtml.append("<input type=\"submit\" value=\"" + strButtonName + "\" style=\"display:none;\"></form>");
        sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>");

        return sbHtml.toString();
    }

3.6页面展示

第三方java支付宝接口 jsp支付宝接口_第三方java支付宝接口

4.支付问题

支付过程中可能遇到的问题。

1.调试错误,请回到请求来源地,重新发起请求。错误代码

ILLEGAL_PARTNER

第三方java支付宝接口 jsp支付宝接口_支付宝_02


含义:合作身份者ID(partner)不正确

原因:合作身份者ID(partner)填写有问题

2.调试错误,请回到请求来源地,重新发起请求。错误代码HAS_NO_PRIVILEGE
 有以下的几种原因:
   1、没有签约这个接口的合同。
   2、签约了相应的接口合同,但没有生效
   3、签约了相应的接口合同,但由于违规违法等原因被审核部门强制关闭。
   出现这种情况最常见的原因是:
 接口使用错误。如,签约的是担保交易的接口合同,商户网站上使用的却是标准双接口;签约的是担保交易的接口合同,商户网站上使用的却是即时到帐。

3.调试错误,请回到请求来源地,重新发起请求。错误代码
ILLEGAL_SIGN
   1.中文编码的问题,把utf-8的用成了gb2312,反之也是一样
   2.产品名称、描述、收获人、地址中含有禁用词汇或者空格:比如武士刀
   3.产品名称、描述、收获人、地址中含有生僻字比如玥、谻、堃、劼、囧、槑 等都通不过签名
   4.您参与加密的参数与您传递给支付宝的参数不匹配
   5.您的支付宝账号、密钥、安全校验码写的不正确或者包含空格
   6.必填参数为空,比如参数subject或者body内容是空的
   如果对2、3的情况不是很清楚,请致电支付宝客户。

5.参考资料

5.1RSA和MD5签名文件总结

集成测试项目全文件目录排版(RSA)

第三方java支付宝接口 jsp支付宝接口_java_03


主要文件说明:

1.AlipayConfig.java 填写商户信息

相同:RSA和MD5签名都需要获取商户的合作者身份PID(参考章节1.1.2)。

不同:RSA需要商户密钥和支付宝公钥(参考章节1.1.4)

MD5需要获取商户的安全校验码(参考章节1.1.3)

2.RSA.java RSA签名方式(MD5签名方式文件为MD5.java)

3.Base64.java RSA签名使用参数

4.AlipaySubmit.java 建立支付请求

由于两种签名方式的参数不同,简历支付请求获取参数值也会不同

5.Alipayapi.jsp 获取参数组成数组调用支付请求

6.Index.jsp 购物页面结算传递参数

7.Readme.txt 项目结构及说明

5.2DEMO文件下载

登录蚂蚁金服-文档中心下载官方提供的DEMO。包含JAVA、PHP、CSHARP三种编程语言,以及MD5和RSA两种签名方式:

下载地址:https://doc.open.alipay.com/docs/doc.htm?treeId=62&articleId=104746&docType=1# 文件展示:下载后解压的文件包含如下内容:

第三方java支付宝接口 jsp支付宝接口_java_04


注:即时到账交易接口.zip是将下载的alipaydirect.zip重命名.

5.2.1 使用MD5签名版本

第三方java支付宝接口 jsp支付宝接口_支付宝接口源码_05


包含JAVA、PHP、CSHARP三种编程语言的GBK和UTF-8各两种编码格式:GBK是中文编码格式(或GB2312),UTF-8是国际编码格式。

使用文件【create_direct_pay_by_user-JAVA-UTF-8】打开文件目录如下:

第三方java支付宝接口 jsp支付宝接口_web_06


可直接导入Eclipse中。

将文件src/com/alipay/config/AlipayConfig.java中

第三方java支付宝接口 jsp支付宝接口_java_07


分别填写企业或商户的合作者身份PID和安全校验码KEY即可运行查看。

5.2.2 使用RSA签名版本

MD5签名版本和RSA签名版本在签名方式的参数上有区别:

第三方java支付宝接口 jsp支付宝接口_web_08


第三方java支付宝接口 jsp支付宝接口_第三方java支付宝接口_09