java 支付宝 第三方即时到账支付 接口_个人免签支付接口 - csdn博客-程序员宅基地

技术标签: 支付宝  即时到账  接口  支付  ------【Java】  

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 = "[email protected]";
    // 读配置文件

    // 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";
}
复制代码

===============================================================================================================

下面是一个简单的应用流程:
从JSP调用的就不说了,因为这也就只是传给后台你要买的东西是什么,价格多少等一些参数。
这里介绍一下后台处理的:

PaymentAction.java

复制代码
/**
     * 获取支付宝交易订单号
     * @return
     */
    public synchronized static String getOrderNum(){
        Date date=new Date();
        DateFormat df=new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return df.format(date);
    }

    protected HttpServletRequest getRequest() {
        return ServletActionContext.getRequest();
    }

//支付宝交易订单号
String orderNum = getOrderNum();

// 此次交易的总金额
getRequest().setAttribute("totalMoney","0.01");
//此次交易的订单号
getRequest().setAttribute("out_trade_no", orderNum);
//商品名称描述
getRequest().setAttribute("subject", "商品名称");


//这里省略了将此次订单信息存到数据库的流程
复制代码

alipay.jsp

复制代码
<%@page import="com.test.constants.AlipayConfig"%>
<%@page import="com.test.util.alipay.UtilDate"%>
<%@page import="com.test.util.alipay.AlipayService"%>
<%
    /*
    功能:设置商品有关信息(入口页)
     *详细:该页面是接口入口页面,生成支付时的URL
     *版本:3.1
     *日期:2010-11-01
     *说明:
     *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
     *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
     *************************注意*****************
    如果您在接口集成过程中遇到问题,
    您可以到商户服务中心(https://b.alipay.com/support/helperApply.htm?action=consultationApply),提交申请集成协助,我们会有专业的技术工程师主动联系您协助解决,
    您也可以到支付宝论坛(http://club.alipay.com/read-htm-tid-8681712.html)寻找相关解决方案
    要传递的参数要么不允许为空,要么就不要出现在数组与隐藏控件或URL链接里。
     */
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>test</title>
        <link rel="SHORTCUT ICON" href="favicon.ico">
<meta name="keywords" content="" />
<meta name="description" content="" />
<style type="text/css">
.font_content{
    font-family:"宋体";
    font-size:14px;
    color:#FF6600;
}
.font_title{
    font-family:"宋体";
    font-size:16px;
    color:#FF0000;
    font-weight:bold;
}
table{
    border: 1px solid #CCCCCC;
}
        </style>
        <script type="text/javascript">
          var _gaq = _gaq || [];
          _gaq.push(['_setAccount', 'UA-25469955-1']);
          _gaq.push(['_trackPageview']);
        
          (function() {
            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
          })();
    </script>
    </head>
    <%
            //request.setCharacterEncoding("UTF-8");
            //AlipyConfig.java中配置信息(不可以修改)
            String input_charset = AlipayConfig.getInstance().input_charset;
            String sign_type = AlipayConfig.getInstance().sign_type;
            String seller_email = AlipayConfig.getInstance().seller_email;
            String partner = AlipayConfig.getInstance().partner;
            String key = AlipayConfig.getInstance().key;

            String show_url = AlipayConfig.getInstance().show_url;
            String notify_url = AlipayConfig.getInstance().notify_url;
            String return_url = AlipayConfig.getInstance().return_url;
            String it_b_pay = AlipayConfig.getInstance().it_b_pay;
            
            //以下参数是需要通过下单时的订单数据传入进来获得
            //必填参数
            String out_trade_no = (String)request.getAttribute("out_trade_no");//请与贵网站订单系统中的唯一订单号匹配
            //订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
            String subject = (String)request.getAttribute("subject");
            //订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
            String body = (String)request.getAttribute("body");
            //订单总金额,显示在支付宝收银台里的“应付总额”里
            String total_fee = (String)request.getAttribute("totalMoney");
            
            //扩展功能参数——默认支付方式
           // String pay_mode = request.getParameter("pay_bank");
            String paymethod = "";        //默认支付方式,四个值可选:bankPay(网银); cartoon(卡通); directPay(余额); CASH(网点支付)
            String defaultbank = "";    //默认网银代号,代号列表见http://club.alipay.com/read.php?tid=8681379
            /*if(pay_mode.equals("directPay")){
                paymethod = "directPay";
            }
            else{
                paymethod = "bankPay";
                defaultbank = pay_mode;
            }*/
            
            //扩展功能参数——防钓鱼
            //请慎重选择是否开启防钓鱼功能
            //exter_invoke_ip、anti_phishing_key一旦被设置过,那么它们就会成为必填参数
            //开启防钓鱼功能后,服务器、本机电脑必须支持远程XML解析,请配置好该环境。
            //建议使用POST方式请求数据
            String anti_phishing_key  = "";                //防钓鱼时间戳
            String exter_invoke_ip= "";                    //获取客户端的IP地址,建议:编写获取客户端IP地址的程序
            //如:
            //anti_phishing_key = AlipayFunction.query_timestamp(partner);    //获取防钓鱼时间戳函数
            //exter_invoke_ip = "202.1.1.1";
            
            //扩展功能参数——其他
            String extra_common_param = "";                //自定义参数,可存放任何内容(除=、&等特殊字符外),不会显示在页面上
            String buyer_email = "137672927";                    //默认买家支付宝账号
            String extend_param = "";
            
            
            //扩展功能参数——分润(若要使用,请按照注释要求的格式赋值)
            String royalty_type = "";                    //提成类型,该值为固定值:10,不需要修改
            String royalty_parameters ="";
            //提成信息集,与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条
            //各分润金额的总和须小于等于total_fee
            //提成信息集格式为:收款方Email_1^金额1^备注1|收款方Email_2^金额2^备注2
            //如:
            //royalty_type = "10"
            //royalty_parameters    = "[email protected]^0.01^分润备注一|[email protected]^0.01^分润备注二"
            
            
            //之前设置的1h将返回
            //错误描述: 抱歉,商户没有开通自定义超时权限,请联系您的商家。
            //错误代码: SELF_TIMEOUT_NOT_SUPPORT
            
            it_b_pay="";
            
            //构造函数,生成请求URL
            String sHtmlText = AlipayService.BuildForm(partner,seller_email,return_url,notify_url,show_url,out_trade_no,
            subject,body,total_fee,paymethod,defaultbank,anti_phishing_key,exter_invoke_ip,extra_common_param,buyer_email,
            royalty_type,royalty_parameters,input_charset,key,sign_type,it_b_pay);
    %>

    <body>
        <table align="center" width="350" cellpadding="5" cellspacing="0">
            <tr>
                <td align="center" class="font_title" colspan="2">订单确认</td>
            </tr>
            <tr>
                <td class="font_content" align="right">订单号:</td>
                <td class="font_content" align="left"><%=out_trade_no%></td>
            </tr>
            <tr>
                <td class="font_content" align="right">付款总金额:</td>
                <td class="font_content" align="left"><%=total_fee%></td>
            </tr>
            <tr>
                <td align="center" colspan="2"><%=sHtmlText%></td>
            </tr>
        </table>
    </body>
</html>
复制代码

支付宝回调的接口:AlipayNotify.java

复制代码
package com.test.action.payment;

import java.util.Date;
import java.util.List;

import com.test.action.base.BaseAction;
import com.test.dao.model.paymentcenter.OrderForm;
import com.test.dao.model.paymentcenter.OrderList;
import com.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";

    }
}
复制代码

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mrlin6688/article/details/53700901

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签