支付宝开放平台开发助手即密钥生成工具,可以进行生成密钥、签名、验签、格式转换、密钥匹配、智能反馈、开放社区相关操作。
使用手机支付宝app进行扫码登录
然后进去注册信息
注册成功后导航框选择开发中心.里面有一个研发服务
然后会到一个密匙生成工具(ps:不可安装在有空格的文件目录下)
下载安装成功后即可运行工具,支付开发平台助手中有一个
获取完后打开文件夹后有一个文件双击运行即可
运行结果如下
进入沙箱 把生成的公钥放进就去 就会自动生成支付宝公钥了
然后创建java项目,添加依赖如下
创建一个controller,写入支付参数(如下) @Controller public class PayController {
private final String APP_ID = “应用的APPID”; private final String APP_PRIVATE_KEY = “生成的应用私钥”; private final String CHARSET = “UTF-8”; private final String ALIPAY_PUBLIC_KEY = “支付宝公钥”; //这是沙箱接口路径,正式路径为https://openapi.alipay.com/gateway.do private final String GATEWAY_URL =“https://openapi.alipaydev.com/gateway.do”; private final String FORMAT = “JSON”; //签名方式 private final String SIGN_TYPE = “RSA2”; //支付宝异步通知路径,付款完毕后会异步调用本项目的方法,必须为公网地址 private final String NOTIFY_URL = “http://公网地址/notifyUrl”; //支付宝同步通知路径,也就是当付款完毕后跳转本项目的页面,可以不是公网地址 private final String RETURN_URL = “http://公网地址/returnUrl”;
}
创建调用支付宝的方法
@RequestMapping(“alipay”) public void alipay(HttpServletResponse httpResponse) throws IOException {
Random r=new Random(); //实例化客户端,填入所需参数 AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); //在公共参数中设置回跳和通知地址 request.setReturnUrl(RETURN_URL); request.setNotifyUrl(NOTIFY_URL); //商户订单号,商户网站订单系统中唯一订单号,必填 //生成随机Id String out_trade_no = UUID.randomUUID().toString(); //付款金额,必填 String total_amount =Integer.toString(r.nextInt(9999999)+1000000); //订单名称,必填 String subject ="奥迪A8 2016款 A8L 60 TFSl quattro豪华型"; //商品描述,可空 String body = "尊敬的会员欢迎购买奥迪A8 2016款 A8L 60 TFSl quattro豪华型"; request.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," + "\"total_amount\":\""+ total_amount +"\"," + "\"subject\":\""+ subject +"\"," + "\"body\":\""+ body +"\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); String form = ""; try { form = alipayClient.pageExecute(request).getBody(); // 调用SDK生成表单 } catch (AlipayApiException e) { e.printStackTrace(); } httpResponse.setContentType("text/html;charset=" + CHARSET); httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面 httpResponse.getWriter().flush(); httpResponse.getWriter().close();} }
测试需要下载沙箱支付宝(苹果手机不可下载)
然后就可以启动项目进行测试了!!
在付款成功后,浏览器会跳转到我们定义的同步回调页面,来验证是否付款成功等操作
@RequestMapping(value = “/returnUrl”, method = RequestMethod.GET) public String returnUrl(HttpServletRequest request, HttpServletResponse response) throws IOException, AlipayApiException { System.out.println("=同步回调=====");
// 获取支付宝GET过来反馈信息 Map<String, String> params = new HashMap<String, String>(); Map<String, String[]> 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] + “,”; } // 乱码解决,这段代码在出现乱码时使用 valueStr = new String(valueStr.getBytes(“utf-8”), “utf-8”); params.put(name, valueStr); }
System.out.println(params);//查看参数都有哪些 boolean signVerified = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE); // 调用SDK验证签名 //验证签名通过 if(signVerified){ // 商户订单号 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 total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8"); System.out.println("商户订单号="+out_trade_no); System.out.println("支付宝交易号="+trade_no); System.out.println("付款金额="+total_amount); //支付成功,修复支付状态 payService.updateById(Integer.valueOf(out_trade_no)); return "ok";//跳转付款成功页面}else{ return “no”;//跳转付款失败页面 } }
上面为支付宝同步调用处理,但是官方建议应在异步调用方法中处理付款成功后的操作,但因异步调用的路径必须为公网地址,支付宝才可以发送请求给我们,故这里不写异步调用的方法了,需要注意的是,异步调用为post请求,且传递来的参数会多一些,但基本与同步调用的操作一致,下面为支付宝官方调用图解如下:
附赠支付宝密钥流程图如下