代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
支付宝 第三方即时到账支付 接口
作者:
jessica
/ 发布于
2017/4/7
/
809
alipay 的几个内核功能文件: ====================================================================================================== AlipayFunction.java package com.test.util.alipay; import java.io.FileWriter; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader; public class AlipayFunction { /** * 功能:生成签名结果 * @param sArray 要签名的数组 * @param key 安全校验码 * @return 签名结果字符串 */ public static String BuildMysign(Map sArray, String key) { String prestr = CreateLinkString(sArray); //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 prestr = prestr + key; //把拼接后的字符串再与安全校验码直接连接起来 String mysign = Md5Encrypt.md5(prestr); return mysign; } /** * 功能:除去数组中的空值和签名参数 * @param sArray 签名参数组 * @return 去掉空值与签名参数后的新签名参数组 */ public static Map ParaFilter(Map sArray){ List keys = new ArrayList(sArray.keySet()); Map sArrayNew = new HashMap(); for(int i = 0; i < keys.size(); i++){ String key = (String) keys.get(i); String value = (String) sArray.get(key); if( value == null || value.equals("") || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")){ continue; } sArrayNew.put(key, value); } return sArrayNew; } /** * 功能:把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 * @param params 需要排序并参与字符拼接的参数组 * @return 拼接后字符串 */ public static String CreateLinkString(Map params){ List keys = new ArrayList(params.keySet()); Collections.sort(keys); String prestr = ""; for (int i = 0; i < keys.size(); i++) { String key = (String) keys.get(i); String value = (String) params.get(key); if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符 prestr = prestr + key + "=" + value; } else { prestr = prestr + key + "=" + value + "&"; } } return prestr; } /** * 功能:写日志,方便测试(看网站需求,也可以改成把记录存入数据库) * @param sWord 要写入日志里的文本内容 */ public static void LogResult(String sWord){ // 该文件存在于和应用服务器 启动文件同一目录下,文件名是alipay log加服务器时间 try { FileWriter writer = new FileWriter("D:\\alipay_log" + System.currentTimeMillis() + ".txt"); writer.write(sWord); writer.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 功能:用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数 * 注意:远程解析XML出错,与服务器是否支持SSL等配置有关 * @param partner 合作身份者ID * @return 时间戳字符串 * @throws IOException * @throws DocumentException * @throws MalformedURLException */ public static String query_timestamp(String partner) throws MalformedURLException, DocumentException, IOException { String strUrl = "https://mapi.alipay.com/gateway.do?service=query_timestamp&partner="+partner; StringBuffer buf1 = new StringBuffer(); SAXReader reader = new SAXReader(); Document doc = reader.read(new URL(strUrl).openStream()); List<Node> nodeList = doc.selectNodes("//alipay/*"); for (Node node : nodeList) { // 截取部分不需要解析的信息 if (node.getName().equals("is_success") && node.getText().equals("T")) { // 判断是否有成功标示 List<Node> nodeList1 = doc.selectNodes("//response/timestamp/*"); for (Node node1 : nodeList1) { buf1.append(node1.getText()); } } } return buf1.toString(); } } ====================================================================================================== AlipayNotify.java package com.test.util.alipay; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; import com.test.constants.AlipayConfig; public class AlipayNotify { /** * *功能:根据反馈回来的信息,生成签名结果 * @param Params 通知返回来的参数数组 * @param key 安全校验码 * @return 生成的签名结果 */ public static String GetMysign(Map Params, String key){ Map sParaNew = AlipayFunction.ParaFilter(Params);//过滤空值、sign与sign_type参数 String mysign = AlipayFunction.BuildMysign(sParaNew, key);//获得签名结果 return mysign; } /** * *功能:获取远程服务器ATN结果,验证返回URL * @param notify_id 通知校验ID * @return 服务器ATN结果 * 验证结果集: * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 * true 返回正确信息 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ public static String Verify(String notify_id){ //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求 String transport = AlipayConfig.transport; String partner = AlipayConfig.partner; String veryfy_url = ""; if(transport.equalsIgnoreCase("https")){ veryfy_url = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify"; } else{ veryfy_url = "http://notify.alipay.com/trade/notify_query.do?"; } veryfy_url = veryfy_url + "&partner=" + partner + "?ify_id=" + notify_id; String responseTxt = CheckUrl(veryfy_url); return responseTxt; } /** * *功能:获取远程服务器ATN结果 * @param urlvalue 指定URL路径地址 * @return 服务器ATN结果 * 验证结果集: * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 * true 返回正确信息 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ public static String CheckUrl(String urlvalue){ String inputLine = ""; try { URL url = new URL(urlvalue); HttpURLConnection urlConnection = (HttpURLConnection) url .openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader( urlConnection.getInputStream())); inputLine = in.readLine().toString(); } catch (Exception e) { e.printStackTrace(); } return inputLine; } } AlipayService.java package com.test.util.alipay; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class AlipayService { /** * 功能:构造表单提交HTML * @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 input_charset 字符编码格式 目前支持 GBK 或 utf-8 * @param key 安全校验码 * @param sign_type 签名方式 不需修改 * @param key 安全校验码 * @return 表单提交HTML文本 */ public static String BuildForm(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 anti_phishing_key, String exter_invoke_ip, String extra_common_param, String buyer_email, String royalty_type, String royalty_parameters, String input_charset, String key, String sign_type, String it_b_pay){ Map sPara = new HashMap(); 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", anti_phishing_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 sParaNew = AlipayFunction.ParaFilter(sPara); //除去数组中的空值和签名参数 String mysign = AlipayFunction.BuildMysign(sParaNew, key);//生成签名结果 StringBuffer sbHtml = new StringBuffer(); List keys = new ArrayList(sParaNew.keySet()); String gateway = "https://www.alipay.com/cooperate/gateway.do?"; //GET方式传递 //sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + gateway + "_input_charset=" + input_charset + "\" method=\"get\">"); //POST方式传递(GET与POST二必选一) 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 + "\"/>"); //submit按钮控件请不要含有name属性 sbHtml.append("<input type=\"submit\" value=\"支付宝确认付款\"></form>"); sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>"); return sbHtml.toString(); } } ====================================================================================================== Md5Encrypt.java package com.test.util.alipay; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import com.test.constants.AlipayConfig; /** * 功能:支付宝MD5加密处理核心文件,不需要修改 * 版本:3.1 * 修改日期:2010-11-01 * 说明: * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 * 该代码仅供学习和研究支付宝接口使用,只是提供一个 * */ public class Md5Encrypt { /** * Used building output as Hex */ private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; /** * 对字符串进行MD5加密 * * @param text * 明文 * * @return 密文 */ public static String md5(String text) { MessageDigest msgDigest = null; try { msgDigest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new IllegalStateException( "System doesn't support MD5 algorithm."); } try { msgDigest.update(text.getBytes(AlipayConfig.input_charset)); //注意改接口是按照指定编码形式签名 } catch (UnsupportedEncodingException e) { throw new IllegalStateException( "System doesn't support your EncodingException."); } byte[] bytes = msgDigest.digest(); String md5Str = new String(encodeHex(bytes)); return md5Str; } public static char[] encodeHex(byte[] data) { int l = data.length; char[] out = new char[l << 1]; // two characters form the hex value. for (int i = 0, j = 0; i < l; i++) { out[j++] = DIGITS[(0xF0 & data[i]) >>> 4]; out[j++] = DIGITS[0x0F & data[i]]; } return out; } } AlipayConfig.java这里是对账号,Key,回调连接地址等一些设置 package com.test.constants; import java.util.Properties; import com.test.util.PropertiesUtil; public class AlipayConfig { private static AlipayConfig alconfig = null; private AlipayConfig(){ } public static AlipayConfig getInstance(){ if(alconfig==null){ alconfig = new AlipayConfig(); } return alconfig; } // 如何获取安全校验码和合作身份者ID // 1.访问支付宝商户服务中心(b.alipay.com),然后用您的签约支付宝账号登陆. // 2.访问“技术服务”→“下载技术集成文档”(https://b.alipay.com/support/helperApply.htm?action=selfIntegration) // 3.在“自助集成帮助”中,点击“合作者身份(Partner ID)查询”、“安全校验码(Key)查询” // ↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 合作身份者ID,以2088开头由16位纯数字组成的字符串 public static String it_b_pay = "1h"; public static String partner = "2088601003079118"; public static String service = "create_direct_pay_by_user"; // 交易安全检验码,由数字和字母组成的32位字符串 public static String key = "zxcdvxgksaam2zjrmv5cv0p4jqesaioh"; // 签约支付宝账号或卖家收款支付宝帐户 public static String seller_email = "test@yahoo.com.cn"; // 读配置文件 // notify_url 交易过程中服务器通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数 public static String notify_url ="http:www.xxx.com/projectName/alipayTrade.action"; // 付完款后跳转的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数 // return_url的域名不能写成http://localhost/js_jsp_utf8/return_url.jsp,否则会导致return_url执行无效 //public static String return_url = "http:www.xxx.com/projectName/alipayTrade.action"; // 网站商品的展示地址,不允许加?id=123这类自定义参数 public static String show_url = "http://www.alipay.com"; // 收款方名称,如:公司名称、网站名称、收款人姓名等 public static String mainname = "收款方名称"; // ↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ // 字符编码格式 目前支持 gbk 或 utf-8 public static String input_charset = "UTF-8"; // 签名方式 不需修改 public static String sign_type = "MD5"; // 访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http public static String transport = "http"; }
试试其它关键字
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
jessica
贡献的其它代码
(
10
)
.
video视频播放,play()、pause()、duration时长、onen
.
如何固定查询一个时间段的数据
.
支付宝 第三方即时到账支付 接口
.
根据出生年月日计算生日 精确到多少年多少月多少天
.
连接到 POP3 邮箱,并检查是否有邮件
.
如何把有着某个特定名称的所有元素的值都放到一个数组
.
获取当前系统桌面路径
.
code标签
.
组合算法实现
.
Java实体和redis中的Hash相互的转换
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3