package me.xhh.alipay.util; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** *类名:alipay_service *功能:支付宝外部服务接口控制 *详细:该页面是请求参数核心处理文件,不需要修改 *版本:3.0 *修改日期:2010-07-16 *说明: 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ public class AlipayService { /** * 功能:构造请求URL(GET方式请求) * @param partner 合作身份者ID * @param seller_email 签约支付宝账号或卖家支付宝帐户 * @param return_url 付完款后跳转的页面 要用 以http开头格式的完整路径,不允许加?id=123这类自定义参数 * @param notify_url 交易过程中服务器通知的页面 要用 以http开格式的完整路径,不允许加?id=123这类自定义参数 * @param show_url 网站商品的展示地址,不允许加?id=123这类自定义参数 * @param out_trade_no 请与贵网站订单系统中的唯一订单号匹配 * @param subject 订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。 * @param body 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里 * @param total_fee 订单总金额,显示在支付宝收银台里的“应付总额”里 * @param paymethod 默认支付方式,四个值可选:bankPay(网银); cartoon(卡通); directPay(余额); CASH(网点支付) * @param defaultbank 默认网银代号,代号列表见club.alipay.com/read.php?tid=8681379 * @param encrypt_key 防钓鱼时间戳 * @param exter_invoke_ip 买家本地电脑的IP地址 * @param extra_common_param 自定义参数,可存放任何内容(除等特殊字符外),不会显示在页面上 * @param buyer_email 默认买家支付宝账号 * @param royalty_type 提成类型,该值为固定值:10,不需要修改 * @param royalty_parameters 提成信息集,与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条 * @param it_b_pay 超时时间,不填默认是15天。八个值可选:1h(1小时),2h(2小时),3h(3小时),1d(1天),3d(3天),7d(7天),15d(15天),1c(当天) * @param input_charset 字符编码格式 目前支持 GBK 或 utf-8 * @param key 安全校验码 * @param sign_type 加密方式 不需修改 * @return 请求URL */ public static String CreateUrl(String partner, String seller_email, String return_url, String notify_url, String show_url, String out_trade_no, String subject, String body, String total_fee, String paymethod, String defaultbank, String encrypt_key, String exter_invoke_ip, String extra_common_param, String buyer_email, String royalty_type, String royalty_parameters, String it_b_pay, String input_charset, String key, String sign_type){ Map<String, String> sPara = new HashMap<String, String>(); sPara.put("service","create_direct_pay_by_user"); sPara.put("payment_type","1"); sPara.put("partner", partner); sPara.put("seller_email", seller_email); sPara.put("return_url", return_url); sPara.put("notify_url", notify_url); sPara.put("_input_charset", input_charset); sPara.put("show_url", show_url); sPara.put("out_trade_no", out_trade_no); sPara.put("subject", subject); sPara.put("body", body); sPara.put("total_fee", total_fee); sPara.put("paymethod", paymethod); sPara.put("defaultbank", defaultbank); sPara.put("anti_phishing_key", encrypt_key); sPara.put("exter_invoke_ip", exter_invoke_ip); sPara.put("extra_common_param", extra_common_param); sPara.put("buyer_email", buyer_email); sPara.put("royalty_type", royalty_type); sPara.put("royalty_parameters", royalty_parameters); sPara.put("it_b_pay", it_b_pay); String strUrl = "https://www.alipay.com/cooperate/gateway.do?"; Map<String, String> sParaNew = AlipayBase.ParaFilter(sPara); //除去数组中的空值和签名参数 String mysign = AlipayBase.BuildMysign(sParaNew, key);//生成签名结果 //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 String arg = AlipayBase.CreateLinkString_urlencode(sParaNew, input_charset); //得到请求URL strUrl = strUrl + arg + "sign=" + mysign + "&sign_type=" + sign_type; return strUrl; } /** * 功能:构造Post表单提交HTML(POST方式请求) * @param partner 合作身份者ID * @param seller_email 签约支付宝账号或卖家支付宝帐户 * @param return_url 付完款后跳转的页面 要用 以http开头格式的完整路径,不允许加?id=123这类自定义参数 * @param notify_url 交易过程中服务器通知的页面 要用 以http开格式的完整路径,不允许加?id=123这类自定义参数 * @param show_url 网站商品的展示地址,不允许加?id=123这类自定义参数 * @param out_trade_no 请与贵网站订单系统中的唯一订单号匹配 * @param subject 订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。 * @param body 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里 * @param total_fee 订单总金额,显示在支付宝收银台里的“应付总额”里 * @param paymethod 默认支付方式,四个值可选:bankPay(网银); cartoon(卡通); directPay(余额); CASH(网点支付) * @param defaultbank 默认网银代号,代号列表见club.alipay.com/read.php?tid=8681379 * @param encrypt_key 防钓鱼时间戳 * @param exter_invoke_ip 买家本地电脑的IP地址 * @param extra_common_param 自定义参数,可存放任何内容(除等特殊字符外),不会显示在页面上 * @param buyer_email 默认买家支付宝账号 * @param royalty_type 提成类型,该值为固定值:10,不需要修改 * @param royalty_parameters 提成信息集,与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条 * @param it_b_pay 超时时间,不填默认是15天。八个值可选:1h(1小时),2h(2小时),3h(3小时),1d(1天),3d(3天),7d(7天),15d(15天),1c(当天) * @param input_charset 字符编码格式 目前支持 GBK 或 utf-8 * @param key 安全校验码 * @param sign_type 加密方式 不需修改 * @param key 安全校验码 * @return 表单提交HTML文本 */ public static String BuildPostform(String partner, String seller_email, String return_url, String notify_url, String show_url, String out_trade_no, String subject, String body, String total_fee, String paymethod, String defaultbank, String encrypt_key, String exter_invoke_ip, String extra_common_param, String buyer_email, String royalty_type, String royalty_parameters, String it_b_pay, String input_charset, String key, String sign_type){ Map<String, String> sPara = new HashMap<String, String>(); sPara.put("service","create_direct_pay_by_user"); sPara.put("payment_type","1"); sPara.put("partner", partner); sPara.put("seller_email", seller_email); sPara.put("return_url", return_url); sPara.put("notify_url", notify_url); sPara.put("_input_charset", input_charset); sPara.put("show_url", show_url); sPara.put("out_trade_no", out_trade_no); sPara.put("subject", subject); sPara.put("body", body); sPara.put("total_fee", total_fee); sPara.put("paymethod", paymethod); sPara.put("defaultbank", defaultbank); sPara.put("anti_phishing_key", encrypt_key); sPara.put("exter_invoke_ip", exter_invoke_ip); sPara.put("extra_common_param", extra_common_param); sPara.put("buyer_email", buyer_email); sPara.put("royalty_type", royalty_type); sPara.put("royalty_parameters", royalty_parameters); sPara.put("it_b_pay", it_b_pay); Map<String, String> sParaNew = AlipayBase.ParaFilter(sPara); //除去数组中的空值和签名参数 String mysign = AlipayBase.BuildMysign(sParaNew, key);//生成签名结果 StringBuffer sbHtml = new StringBuffer(); List<String> keys = new ArrayList<String>(sParaNew.keySet()); String gateway = "https://www.alipay.com/cooperate/gateway.do?"; sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + input_charset + "\" method=\"post\">"); for (int i = 0; i < keys.size(); i++) { String name = (String) keys.get(i); String value = (String) sParaNew.get(name); sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>"); } sbHtml.append("<input type=\"hidden\" name=\"sign\" value=\"" + mysign + "\"/>"); sbHtml.append("<input type=\"hidden\" name=\"sign_type\" value=\"" + sign_type + "\"/></form>"); sbHtml.append("<input type=\"button\" name=\"v_action\" value=\"支付宝确认付款\" onClick=\"document.forms['alipaysubmit'].submit();\">"); return sbHtml.toString(); } }