进入蚂蚁金服开放平台->开发者中心
按照文档新建应用,下载RSA密钥秘钥生成器,然后设置为应用公钥,设置完成后会自动生成支付宝公钥。
下载demo代码,下图为web支付,包括一系列功能及回调通知、异步通知。
更改AlipayConfig.java代码
将demo改成servlet请求,方便逻辑处理返回其他数据
AlipayConfig.java
package com.alipay.config; import java.io.FileWriter; import java.io.IOException; /* * *类名:AlipayConfig *功能:基础配置类 *详细:设置帐户有关信息及返回路径 *修改日期:2017-04-05 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 public static String app_id = "APPID"; // 商户私钥,您的PKCS8格式RSA2私钥 public static String merchant_private_key = "RSA私钥"; // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 public static String alipay_public_key = "根据RSA公钥生成的支付宝公钥"; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 public static String notify_url = "http://异步通知接口地址/notify_url"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 public static String return_url = "http://同步通知地址/Alipay/return_url.jsp"; // 签名方式 public static String sign_type = "RSA2"; // 字符编码格式 public static String charset = "utf-8"; // 支付宝网关 public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do"; //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ }
Pay.java
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取要向支付宝支付的参数,由页面传过来 //商户订单号,商户网站订单系统中唯一订单号,必填 String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8"); //付款金额,必填 String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8"); //订单名称,必填 String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8"); //商品描述,可空 String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8"); //获得初始化的AlipayClient AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //设置请求参数 AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(AlipayConfig.return_url); //设置同步回调通知 alipayRequest.setNotifyUrl(AlipayConfig.notify_url); //设置异步回调通知 //设置支付参数 alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," + "\"total_amount\":\""+ total_amount +"\"," + "\"subject\":\""+ subject +"\"," + "\"body\":\""+ body +"\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明 //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," // + "\"total_amount\":\""+ total_amount +"\"," // + "\"subject\":\""+ subject +"\"," // + "\"body\":\""+ body +"\"," // + "\"timeout_express\":\"10m\"," // + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节 //请求 String result = null; try { result = alipayClient.pageExecute(alipayRequest).getBody(); } catch (AlipayApiException e) { // TODO Auto-generated catch block e.printStackTrace(); } //输出 /*打印的是支付宝付款码页面<form name="punchout_form" method="post" action="https://openapi.alipaydev.com/gateway.do?sign=NM7Zk33PH6W%2BFxkXVMfcg4ZeTVas3YS5aJoktIiZZOLv1hO4o23yHQvSW%2BTRt5RJCMJFcX0V%2BJQPoHwznZDA31ZywODBfqTjhsHaBenpbmxVOXjKSJE0ODI8Wf39d2AMDRThIJT6m4FtGYvbHMAgHeDLhX0X5HYgg5mGzZJLYAXbcgBKJioULyEX5Yfn%2Bd7twx8F01pJWsfeCFWkQNd46GetzQ83HivXDEmHXEbV3N47gjgJYBSlptLhK%2Bj9d8QTzvYJ6el3D×tamp=2018-07-06+10%3A17%3A37&sign_type=RSA2¬ify_url=http%3A%2F%2Flocalhost%3A80%2FAlipay%2Fnotify_url.jsp&charset=utf-8&app_id=20160804&method=alipay.trade.page.pay&return_url=http%3A%2F%2Flocalhost%3A80%2FAlipay%2Freturn_url.jsp&version=1.0&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json"> <input type="hidden" name="biz_content" value="{"out_trade_no":"201876101732228","total_amount":"1000","subject":"测试","body":"","product_code":"FAST_INSTANT_TRADE_PAY"}"> <input type="submit" value="立即支付" style="display:none" > </form> <script>document.forms[0].submit();</script>*/ response.resetBuffer(); response.setContentType("text/html;charset=UTF-8"); response.getOutputStream().write(result.toString().getBytes("utf-8")); response.getOutputStream().flush(); //response.getWriter().println(result); //response.getWriter().flush(); }
支付接口源码
问题:
回调通知验签成功,异步通知验签失败。要把异步通知中demo代码的这段注释