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_KEYAPP_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>

 

支付成功后

代码:https://pan.baidu.com/s/1_5g3pJLMI4aKPL74ULgvVQ

posted on 2018-05-17 17:54  手撕高达的村长  阅读(1162)  评论(0编辑  收藏  举报

导航