支付宝APP支付接口-Java服务端

  1. 官方文档
  2. 设置支付宝账户有关参数
  3. 获取签名后订单信息
  4. 支付宝支付同步通知
  5. 支付宝异步通知

官方文档

官方文档
官方Demo及sdk下载

设置支付宝账户有关参数

接口功能:外部商户App唤起快捷SDK创建订单并支付。

public class AlipayConfig {
    public static final String COMMODITY_SUBJECT = "";//商品的标题
    /**
     * 支付宝网关(固定)
     */
    public static final String URL = "https://openapi.alipay.com/gateway.do";
    /**
     * APPID即创建应用后生成
     */
    public static String APP_ID = "";
    /**
     * 开发者应用私钥,由开发者自己生成
     */
    public static final String APP_PRIVATE_KEY = "XXX";//设置成自己,也可以需改为可配置的
    /**
     * 参数返回格式,只支持json
     */
    public static final String FORMAT = "json";
    /**
     * 请求和签名使用的字符编码格式,支持GBK和UTF-8
     */
    public static final String CHARSET = "UTF-8";
    /**
     * 支付宝公钥,由支付宝生成
     */
    public static String ALIPAY_PUBLIC_KEY = "";

    /**
     * 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
     */
    public static final String SIGN_TYPE = "RSA2";
    /**
     * 支付宝异步通知地址
     */
    public static String ALIPAY_NOTIFY_URL = "";
    /**
     * 支付超时时间
     */
    public static String TIMEOUT_EXPRESS = "";
    /**
     * 可支付的渠道
     */
    public static String ENABLE_PAY_CHANNELS = "";

    static {
        /**
          * 设置配置项,具体请重写
          */
        Configuration conf = null;
        PathUtil pathUtil = new PathUtil();
        try {
            conf = new Configuration(pathUtil.getWebRoot() + "/WEB-INF/classes/sysconfig.properties");
            ALIPAY_NOTIFY_URL = conf.getValue("alipay_notify_url")==null?"":conf.getValue("alipay_notify_url");
            TIMEOUT_EXPRESS = conf.getValue("timeout_express")==null?"":conf.getValue("timeout_express");
            ENABLE_PAY_CHANNELS = conf.getValue("enable_pay_channels")==null?"":conf.getValue("enable_pay_channels");
            APP_ID = conf.getValue("appid")==null?"":conf.getValue("appid");

            FileReader fr;
            BufferedReader bufr = null;
            try {
                fr = new FileReader(pathUtil.getWebRoot()+"/WEB-INF/classes/alipay_public_key.txt");
                bufr = new BufferedReader(fr);
                ALIPAY_PUBLIC_KEY = bufr.readLine();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally{
                if(bufr != null){
                    try {
                        bufr.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
     */
    public static final String PRODUCT_CODE = "QUICK_MSECURITY_PAY";
}

获取签名后订单信息

文档--App支付请求参数说明

/**
 * 生成APP支付订单信息
 * @param amount 总金额
 * @param body 商品描述
 * @param outTradeNo 订单编码
 * @return
 */
public String aliPay(String amount, String body, String outTradeNo) {
    // 实例化客户端
    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类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
    AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
    // SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
    AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
    model.setPassbackParams(URLEncoder.encode(body)); // 描述信息 添加附加数据
    model.setSubject(AlipayConfig.COMMODITY_SUBJECT); // 商品标题
    model.setOutTradeNo(outTradeNo); // 商家订单编号(13位时间戳+4位认证人员信息表id后四位,不足前面补0)
    model.setTimeoutExpress(AlipayConfig.TIMEOUT_EXPRESS); // 超时关闭该订单时间
    model.setTotalAmount(amount); // 订单总金额
    model.setProductCode(AlipayConfig.PRODUCT_CODE); // 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
    model.setEnablePayChannels(AlipayConfig.ENABLE_PAY_CHANNELS);
    request.setBizModel(model);
    request.setNotifyUrl(AlipayConfig.ALIPAY_NOTIFY_URL); // 回调地址
    String orderStr = "";
    try {
        // 这里和普通的接口调用不同,使用的是sdkExecute
        AlipayTradeAppPayResponse response = alipayClient
                .sdkExecute(request);
        orderStr = response.getBody();
        System.out.println(orderStr);// 就是orderString 可以直接给客户端请求,无需再做处理。
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    return orderStr;
}

支付宝支付同步通知

文档--App支付同步通知参数说明

由于同步通知和异步通知都可以作为支付完成的凭证,且异步通知支付宝一定会确保发送给商户服务端。为了简化集成流程,商户可以将同步结果仅仅作为一个支付结束的通知(忽略执行校验),实际支付是否成功,完全依赖服务端异步通知。

忽略该接口

支付宝异步通知

文档--App支付服务器异步通知参数说明

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;

/**
 * 支付宝异步通知
 * @author bin
 *
 */
@Controller
public class AlipayAsynchronousNotificationREQ {
    Logger logger = Logger.getLogger(AlipayAsynchronousNotificationREQ.class);

    @Transactional(rollbackFor = Exception.class)
    @RequestMapping("/getAsynchronousNotificationREQ")
    public void getAsynchronousNotificationREQ(HttpServletRequest request,
            HttpServletResponse response) throws AlipayApiException,
            IOException {
        PrintWriter out = response.getWriter();
        // 获取支付宝POST过来反馈信息
        logger.debug("支付宝异步回调");
        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] + ",";
                logger.debug(valueStr);
            }
            // 乱码解决,这段代码在出现乱码时使用。
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }

        boolean flag = AlipaySignature.rsaCheckV1(params,
                AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
                AlipayConfig.SIGN_TYPE);
        if (flag) {
            if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {
                // 订单金额
                String amount = params.get("total_amount");
                // 商户订单号
                String out_trade_no = params.get("out_trade_no");
                // 支付宝交易号
                String trade_no = params.get("trade_no");
                // 买家支付宝用户号
                String buyer_id = params.get("buyer_id");
                // 交易创建时间 格式为yyyy-MM-dd HH:mm:ss
                String gmt_create = params.get("gmt_create");
                // ...
                // 添加自己的业务逻辑,如记录交易成功,支付宝返回的信息
                // ...

                out.print("success");
                logger.debug("-----支付宝异步通知成功----");

            } else {
                logger.debug("-----支付宝异步通知,订单未成功付款----");
                out.print("failure");
            }
        } else {
            logger.debug("-----支付宝异步通知,订单验证错误----");
            out.print("failure");
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:支付宝APP支付接口-Java服务端

文章字数:1.4k

本文作者:Bin

发布时间:2017-05-27, 22:28:27

最后更新:2019-08-06, 00:49:12

原始链接:http://coolview.github.io/2017/05/27/%E6%94%AF%E4%BB%98%E5%AE%9DAPP%E6%94%AF%E4%BB%98%E6%8E%A5%E5%8F%A3-Java%E6%9C%8D%E5%8A%A1%E7%AB%AF/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录