java 支付宝wap支付初识
最近突然想弄下支付宝的支付,因为感觉很好玩。中间遇到很多问题,查查找找,总算是整了两天给整出来了,这里为自己记录下。
第一步:直接去安卓支付宝的官方文档去,写的很清楚了已经,这里有源码https://docs.open.alipay.com/54/106682/
不过,源码我是没看明白的,感觉更加的一头雾水。
不过,还是要做好第一步,就是在开发者中心去申请应用,得到APPID和秘钥。
第二步:差不多做好后,https://openhome.alipay.com/platform/appDaily.htm?tab=info
去使用沙箱环境,是模拟支付的,也有APPID
沙箱里面分别有买家的账号和商家的账号,支付就用买家的账号就行了
第三步:准备工作做好了就差不多上代码了。
代码之前,一定要走这个包。
package com.pay; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradeWapPayRequest; /** * Servlet implementation class PayServlet */ @WebServlet("/PayServlet") public class PayServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public PayServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String APP_ID = "2016091500518221"; String APP_PRIVATE_KEY = "支付公钥"; String CHARSET = "UTF-8"; String ALIPAY_PUBLIC_KEY = "应用公钥"; String url = "https://openapi.alipaydev.com/gateway.do"; //https://openapi.alipay.com/gateway.do AlipayClient alipayClient = new DefaultAlipayClient(url, APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //获得初始化的AlipayClient AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request //alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp"); alipayRequest.setReturnUrl("http://127.0.0.1:8080/Pay/return_url.jsp");//返回地址,如:通知支付成功 alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共参数中设置回跳和通知地址 alipayRequest.setBizContent("{" + " \"out_trade_no\":\"20150320010101011\"," + //订单号 " \"total_amount\":\"88.88\"," + // 支付价格 " \"subject\":\"Iphone8 64G\"," + // 商品信息 " \"product_code\":\"QUICK_WAP_PAY\"" + " }");//填充业务参数 String form=""; try { form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单 } catch (AlipayApiException e) { e.printStackTrace(); } response.setContentType("text/html;charset=" + CHARSET); response.getWriter().write(form);//直接将完整的表单html输出到页面 response.getWriter().flush(); response.getWriter().close(); response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
直接在web运行就行,浏览器会弹出支付页面,然后买家输入账户进行支付就OK了。
值得注意的是这里的ALIPAY_PUBLIC_KEY 和APP_PRIVATE_KEY 并不是一个东西,我最开始在这里绕了下弯路的,ALIPAY_PUBLIC_KEY是自己生成的,APP_PRIVATE_KEY 是根据应用公钥,支付宝自己生成 的一个。
然后配置一个对应的回调页面。就是支付完成后,跳转的页面。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="com.alipay.api.internal.util.AlipaySignature"%> <%@ page import="java.util.*"%> <%@ page import="java.util.Map"%> <%@ page import="com.alipay.api.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>支付宝页面跳转同步通知页面</title> </head> <body> <% //获取支付宝GET过来反馈信息 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"), "utf-8"); 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 total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8"); //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)// //计算得出通知验证结果 String ALIPAY_PUBLIC_KEY = "";//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type) boolean verify_result = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "UTF-8", "RSA2"); if(verify_result){//验证成功 ////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //该页面可做页面美工编辑 out.clear(); out.println("验证成功<br />"); //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ////////////////////////////////////////////////////////////////////////////////////////// }else{ //该页面可做页面美工编辑 out.clear(); out.println("验证失败"); } %> 订单号:<% out.println(out_trade_no); %><br> 支付宝交易号:<% out.println(trade_no); %><br> 交易金额:<% out.println(total_amount); %><br> </body> </html>
支付成功后