支付宝沙箱
Posted bigbox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支付宝沙箱相关的知识,希望对你有一定的参考价值。
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"; } }
以上是关于支付宝沙箱的主要内容,如果未能解决你的问题,请参考以下文章