支付宝第三方支付

1.支付宝网页支付java

String goodsAmount = request.getParameter();

String subject = "童装";
       
//把请求参数打包
Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("service", "alipay.wap.create.direct.pay.by.user");//手机网页支付
sParaTemp.put("partner", AlipayConfig.partner);
sParaTemp.put("seller_id", AlipayConfig.seller_id);
sParaTemp.put("_input_charset", AlipayConfig.input_charset);
sParaTemp.put("payment_type", AlipayConfig.payment_type);
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);
sParaTemp.put("show_url", "www.abc.com");
sParaTemp.put("out_trade_no", recharge.getOrderNo());//调用支付宝以前生成的商品订单号
sParaTemp.put("subject", subject);
sParaTemp.put("total_fee", goodsAmount);//金额
//sParaTemp.put("body", body);
/*其余业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1
//如sParaTemp.put("参数名","参数值");*/

//创建请求,请求成功支付宝服务器返回一段网页代码
String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "确认");

//将这段代码以网页形式返回给用户便可进行支付

配置文件web

package alipay.config;

/* *
 *类名:AlipayConfigApp
 *功能:基础配置类
 *详细:设置账户有关信息及返回路径
 *版本:3.4
 *修改日期:2016-03-08
 *说明:
 *如下代码只是为了方便商户测试而提供的样例代码,商户能够根据本身网站的须要,按照技术文档编写,并不是必定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    // 合做身份者ID,签约帐号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
    public static String partner = "2088************";

    // 收款支付宝帐号,以2088开头由16位纯数字组成的字符串,通常状况下收款帐号就是签约帐号
    public static String seller_id = partner;

    // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
    public static String key = "****h2lh2g847h****kuu6fu8cl0****";

    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网能够正常访问
    public static String notify_url = "http://abc.def.com/";

    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网能够正常访问
    public static String return_url = "http://abc.def.com/";

    // 签名方式
    public static String sign_type = "MD5";

    // 调试用,建立TXT日志文件夹路径,见AlipayCore.java类中的logResult(String sWord)打印方法。
    public static String log_path = "C:\\";

    // 字符编码格式 目前支持 gbk 或 utf-8
    public static String input_charset = "utf-8";

    // 支付类型 ,无需修改
    public static String payment_type = "1";

    // 调用的接口名,无需修改,即时到帐
    public static String service = "create_direct_pay_by_user";


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

//↓↓↓↓↓↓↓↓↓↓ 请在这里配置防钓鱼信息,若是没开通防钓鱼功能,为空便可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    // 防钓鱼时间戳  若要使用请调用类文件submit中的query_timestamp函数
    public static String anti_phishing_key = "";

    // 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1
    public static String exter_invoke_ip = "";

//↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,若是没开通防钓鱼功能,为空便可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

}

notify_url不能带端口号和参数数组

支付成功后异步回调商家服务器安全

/**
     * 支付宝异步通知网页版
     */
    @RequestMapping("paymentNotifyCallBack")
    public void paymentNotifyCallBack() {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            //获取支付宝POST过来反馈信息
            Map<String, String> params = new HashMap<String, String>();
            Map requestParams = request.getParameterMap();
            for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                String name = (String) iter.next();
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                params.put(name, valueStr);
            }

            //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(如下仅供参考)//
            //商户订单号

            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

            //支付宝交易号

            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

            //交易状态
            String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

            //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

            if (AlipayNotify.verify(params)) {//验证成功
                if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
                    logger.info("支付宝web回调后台成功......");
                    Recharge recharge = rechargeService.getRechargeByOrderNo(out_trade_no);
                    recharge.setUpdateDate(new Date());
                    recharge.setTradeNo(trade_no);//交易号
                    recharge.setPayTime(new Date());//付款时间
                    recharge.setPayStatus(1);
                    recharge.setPayType(1);
                    int flag = rechargeService.update(recharge);
                    if (flag > 0) {
                        logger.info("订单状态修改为功.........");
                    } else {
                        logger.info("订单状态修改失败..........");
                    }
                    AlipayCore.logResult("notify_url success!");
                }

            } else {//验证失败
                out.print("fail");
            }
        } catch (Exception e) {
            logger.info("接收支付宝异步通知出错:" + e);
            e.printStackTrace();
        }
    }

同步通知服务器

 

2.支付宝app支付app

//将参数打包成数组
String[] parameters = {
    "partner=\"" + AlipayConfigApp.partner + "\"",
    "seller_id=\"" + AlipayConfigApp.partner + "\"",
    "out_trade_no=\"" + recharge.getOrderNo() + "\"",
    "subject=\"童装\"",
    "body=\"童装\"",
    "total_fee=\"" + String.valueOf(recharge.getRechargeAmount()) + "\"",
    "notify_url=\"http://zhaopincmbs.fangshangqu.com/recruitcmbs/alipay/notifyCallBackApp.htm\"",
    "service=\"mobile.securitypay.pay\"",
    "payment_type=\"1\"",
    "input_charset=\"utf-8\""
};
//调用支付宝接口
    String result = AlipayCoreApp.signAllString(parameters);
//将结果返回给客户端
    resultMap.put("data1", result);
       
outJson(resultMap);

异步回调异步

//获取支付宝POST过来反馈信息
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。若是mysign和sign不相等也可使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }

        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(如下仅供参考)//

        try {

            //商户订单号
            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
            //支付宝交易号
            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

            //交易状态
            String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

            //异步通知ID
            String notify_id = request.getParameter("notify_id");

            //sign
            String sign = request.getParameter("sign");
            //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

            if (notify_id != "" && notify_id != null) {////判断接受的post通知中有无notify_id,若是有则是异步通知。
                if (AlipayNotifyApp.verifyResponse(notify_id).equals("true"))//判断成功以后使用getResponse方法判断是不是支付宝发来的异步通知。
                {
                    if (AlipayNotifyApp.getSignVeryfy(params, sign))//使用支付宝公钥验签
                    {
                        if (trade_status.equals("TRADE_SUCCESS")) {
                            logger.info("支付宝成功......");
                            //String ... = ...
                            //商户能够从params中获取通知中的数据
                            //而后进行支付成功后的业务逻辑处理
                            System.out.println("订单" + out_trade_no + "支付成功");
                            logger.info("支付回调后台成功......");
                            Recharge recharge = rechargeService.getRechargeByOrderNo(out_trade_no);

                            recharge.setUpdateDate(new Date());
                            recharge.setTradeNo(trade_no);//交易号
                            recharge.setPayTime(new Date());//付款时间
                            recharge.setPayStatus(1);
                            recharge.setPayType(1);
                            int flag = rechargeService.update(recharge);
                            if (flag > 0) {
                                logger.info("订单状态修改为功.........");
                            } else {
                                logger.info("订单状态修改失败..........");
                            }
                            //调试打印log
                            AlipayCoreApp.logResult("notify_url success!", "notify_url");
                        }
                    } else//验证签名失败
                    {
                        out.print("sign fail");
                    }
                } else//验证是否来自支付宝的通知失败
                {
                    out.print("response fail");
                }
            } else {
                out.print("no notify message");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
相关文章
相关标签/搜索