支付宝PC支付

  1. 云栖社区>
  2. 博客>
  3. 正文

支付宝PC支付

JiaoYuXi 2019-06-04 10:11:24 浏览325
展开阅读全文

必备的Jar支持

<!-- 官网说明地址:https://docs.open.alipay.com/54/103419 -->
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.7.26.ALL</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
</dependency>

蚂蚁金服开放平申请创建应用

申请地址:https://openhome.alipay.com/platform/appManage.htm#/apps

电脑网站支付快速接入

文档地址:https://docs.open.alipay.com/270/105899/

支付宝参数配置(AliPayConfig.class)

package com.pay.alipay;

/**
 * 支付宝支付的配置类
 * RSA1升级到RSA2的方式:https://opensupport.alipay.com/support/knowledge/20069/201602242782#/?_k=xj2m2v
 * @author xxx
 */
public class AliPayConfig {
    
    //支付宝网关(固定)
    public static final String URL = "https://openapi.alipay.com/gateway.do";
    //APPID 即创建应用后生成
    public static final String APP_ID = "";
    //开发者私钥,由开发者自己生成
    public static final String APP_PRIVATE_KEY = "";
    //参数返回格式,只支持json
    public static final String FORMAT = "json";
    //编码集,支持GBK/UTF-8
    public static final String CHARSET = "UTF-8";
    //支付宝公钥,由支付宝生成
    public static final String ALIPAY_PUBLIC_KEY = "";
    //商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
    public static final String SIGN_TYPE = "RSA2";
}

支付宝下单支付接口

public void doPost(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws ServletException, IOException {
    //初始化的AlipayClient
    AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, 
            AliPayConfig.APP_ID, AliPayConfig.APP_PRIVATE_KEY,
            AliPayConfig.FORMAT, AliPayConfig.CHARSET, 
            AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
    //创建API对应的request
    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
    //支付成功后跳转的页面,千万不要加端口号(同步网页重定向通知)
    alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
    //支付完成设置回调通知地址,千万不要加端口号(异步服务器通知)
    alipayRequest.setNotifyUrl("http://domain.com/CallBack/alipayNotifyUrl");
    
    //下单时传递的请求参数, 详情参照(https://docs.open.alipay.com/api_1/alipay.trade.page.pay/)请求参数
    Map<String, Object> bizContentMap = new TreeMap<String, Object>();
    //商户网站唯一订单号(必填,类型为String), 最大长度64
    String out_trade_no = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
    bizContentMap.put("out_trade_no", out_trade_no); 
    //商品的标题/交易标题/订单标题/订单关键字等(必填,类型为String), 最大长度256。
    bizContentMap.put("subject", "Iphone6 16G"); 
    //订单总金额,单位为元,精确到小数点后两位(必填,类型为String), 最大长度9。
    bizContentMap.put("total_amount", "0.01"); 
    //销售产品码,与支付宝签约的产品码名称(必填,类型为String), 目前仅支持FAST_INSTANT_TRADE_PAY
    bizContentMap.put("product_code", "FAST_INSTANT_TRADE_PAY");  
    //对一笔交易的具体描述信息。 (非必填,类型为String), 最大长度128。
    bizContentMap.put("body", "新品苹果手机"); 
    
    //填充业务参数
    alipayRequest.setBizContent(JSONObject.toJSONString(bizContentMap));
    String form="";
    try {
        form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    httpResponse.setContentType("text/html;charset=" + CHARSET);
    httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
    httpResponse.getWriter().flush();
    httpResponse.getWriter().close();
}

支付宝下单支付后的回调接口(一定要是否登录都能访问的方法)

/**
 * 支付宝支付完成后异步通知回调函数
 * 提交方式为:Post
 * 注意事项:设置异步通知回调通知的时候,异步通知回调地址不能加端口号!!!
 * AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); 
 * alipayRequest.setNotifyUrl("异步通知回调地址"); 
 * @return 如果通知成功并处理完业务就返回"success",反之返回"fail"。
 */
public String alipayNotifyUrl(HttpServletRequest request) {
    try {
        request.setCharacterEncoding("UTF-8");
    } catch (UnsupportedEncodingException e1) {
        e1.printStackTrace();
    }
    //获取支付宝POST过来反馈信息
    Map<String,String> params = new HashMap<String,String>();
    Map<String,String[]> requestParams = request.getParameterMap();
    for (Iterator<String> 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] + ",";
        }
        params.put(name, valueStr);
    }
    //调用SDK验证签名
    boolean signVerified = false;
    try {
        signVerified = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALIPAY_PUBLIC_KEY, 
                AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
    } catch (AlipayApiException e) {
        e.printStackTrace();
    } 
    if(signVerified){
        //交易状态
        String trade_status = request.getParameter("trade_status");
        if(trade_status.equals("TRADE_FINISHED")){
            //判断该笔订单是否在商户网站中已经做过处理
        }else if (trade_status.equals("TRADE_SUCCESS")){
            //判断该笔订单是否在商户网站中已经做过处理
            System.out.println("订单号: "+request.getParameter("out_trade_no"));
        }
        return "success";
    }else{
        System.out.println("支付宝回调方法签名校验失败!");
        return "fail";
    }
}

网友评论

登录后评论
0/500
评论
JiaoYuXi
+ 关注