Java实现支付宝之第三方支付宝即时到账支付功能

时间:2021-05-20

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://.test.dao.model.paymentcenter.UserPurview; public class AlipayNotify extends BaseAction { private static final long serialVersionUID = 1L; private String buyer_email; private long buyer_id; private String exterface; private String is_success; private String notify_id; private String notify_time; private String notify_type; private String out_trade_no; private String payment_type; private String seller_email; private long seller_id; private String subject; private float total_fee; private String trade_no; private String trade_status; private String sign; private String sign_type; private OrderForm of; //……这里省去了get和set方法 ……………………………………………………………… // 处理支付宝传过来的参数信息 public String alipayTrade() throws Exception { if (this.is_success.equalsIgnoreCase("T") && "TRADE_SUCCESS".equalsIgnoreCase(this.trade_status)) { of = (OrderForm) orderFormService .findOrderFormsByOut_trade_no(this.out_trade_no); if (of != null) { of.setTradeStatus(1); of.setTradeNo(this.trade_no); of.setNotifyTime(new Date()); orderFormService.updateOldModel(of); // 更新 List<OrderList> orderList = orderListService .findOrderFormsByOutTradeNo(this.out_trade_no); for (OrderList ol : orderList) { //这里省去了处理订单逻辑代码…………………… } } //回调成功之后,给支付宝返回一个 "success" 字符就可以了 return SUCCESS; } return "failure"; } }

就这样,支付宝的第三方即时到账接口就算实现了。

以上所述是小编给大家介绍的Java实现支付宝之第三方支付宝即时到账支付功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章