支付宝沙箱

1.字段概念

APPID:收款账号既是您的APPID对应支付宝账号
商户私钥 merchant_private_key,您的PKCS8格式RSA2私钥
支付宝公钥 alipay_public_key,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应 
              APPID下的支付宝公钥
服务器异步通知页面路径  notify_url  
页面跳转同步通知页面路径  return_url
签名方式 sign_type = "RSA2"
沙箱网关  gatewayUrl ="https://openapi.alipaydev.com/gateway.do"

异步回调指的是:在发起一个异步任务的同时指定一个函数,在异步任务完成时会自动的调用这个函数。

通常情况下,异步都会和回调函数一起使用,使用方法即是add_done_callback(),给Future对象绑定一个回调函数。

1.添加项目依赖,主要是引入 alipay-sdk-java,提供支付宝支付支持。

2.支付宝支付接口封装

       Alipay 是对支付宝支付功能的封装,它接收一个 AlipayBean 为参数,最终通过调用 AlipayClient 的 pageExecute 方法返回支付页面。

3. 接口调用参数封装对象如下:AlipayBean.java

4. 订单业务封装   订单业务提供支付宝支付接口 alipay,内部通过调用 PayService 完成订单支付

5.PayService 封装了 Alipay, 统一对外提供的支付服务接口

@Controller
public class AlipayResponseController {
 
    @RequestMapping("/notify_url")
    public String notify_url(HttpServletRequest request, HttpServletResponse response)
            throws IOException, AlipayApiException {
 
        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);
        }
 
        // 商户订单号
 
        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");
 
        // 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
        // 计算得出通知验证结果
        // boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String
        // publicKey, String charset, String sign_type)
        boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
                "RSA2");
        PrintWriter pw = response.getWriter();
        if (verify_result) {// 验证成功
            //////////////////////////////////////////////////////////////////////////////////////////
 
            // ——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
 
            if (trade_status.equals("TRADE_FINISHED")) {
                // 判断该笔订单是否在商户网站中已经做过处理
                // 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                // 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                // 如果有做过处理,不执行商户的业务程序
                System.out.println("交易完成");
                // 注意:
                // 如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
                // 如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
            } else if (trade_status.equals("TRADE_SUCCESS")) {
                System.out.println("交易成功");
                // 判断该笔订单是否在商户网站中已经做过处理
                // 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                // 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                // 如果有做过处理,不执行商户的业务程序
 
                // 注意:
                // 如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
            }
 
            else if (trade_status.equals("WAIT_BUYER_PAY")) {
 
                System.out.println("交易创建,等待付款");
 
            }
            // ——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
 
            pw.println("success");
 
        } else {// 验证失败
            pw.println("fail");
        }
 
        return null;
    }
 
    @RequestMapping("/return_url")
    public String return_url(HttpServletRequest request, HttpServletResponse response) {
 
        return "return";
    }
}

猜你喜欢

转载自www.cnblogs.com/bigbox/p/12907802.html