支付宝app支付-java服务端

一定要去下载最新的demo里面包含的sdk包(我下载的2月份的的包,3月份用的时候,出现了一个问题,在支付时,取消支付,直接把我的服务端搞死[还没去研究],后来换成最新包就好了),这是我遇到的尴尬问题
 

支付只需要检查几个点就可以很容易实现:

1. 你要选择的是app支付,还是wap支付等等;

2. 你的配置是否正确,即面的配置类,里面的参数一定要正确, 有可能你的会出现乱码,请检查INPUT_CHARSET这个参数(编码格式);

3. AliPay类中,需要注意你产生的业务订单号, 订单号重复提交,支付宝会提示你请勿重新提交;

4. 关于异步回调,一定要外网能访问的到的,我的sing_type是RSA使用AlipaySignature.rsaCheckV1验签,不要用AlipaySignature.rsaCheckV2;

以下是代码:

[记录一下中间遇到的问题]

这是AliPayConfig配置类:

/**
 * Created by Administrator.
 * Created on 2018/3/27.
 * Description: 支付宝配置类
 */
public class AliPayConfig {

    // 合作身份者ID,以2088开头由16位纯数字组成的字符串, 商户ID
    public static String PARTNER = "你的partner";
    // 请求网关地址
//    public static String SERVICE_URL = "https://openapi.alipaydev.com/gateway.do"; // 测试网关
    public static String SERVICE_URL = "https://openapi.alipay.com/gateway.do"; // 正式网关
    //固定值
    public static String SERVICE = "mobile.securitypay.pay";
    public static String SELLER_ID = "*******@163.com";
    //私钥
    public static String PRIVATE_KEY = "你的私钥串";
    // 支付宝的公钥,无需修改该值(不要删除也不要修改,在接收通知的时候需要进行签名认证)
    public static String ALI_PUBLIC_KEY = "这个是支付宝公钥";
    // 商户的公钥钥
    public static String PUBLIC_KEY = "这个是应用公钥";
    // 字符编码格式 目前支持 GBK 或 UTF-8
    public static String INPUT_CHARSET = "UTF-8";
    // 签名方式 不需修改[我用的是RSA]
    public static String SIGN_TYPE = "RSA";
    //APPID
    public static String APPID = "你的appid";
    // 支付宝回调地址,需要外网能访问的地址
    public static String NOTIFY_URL = "http://你的域名或服务器ip/pay/alipay/notify";
    // 返回格式
    public static String FORMAT = "JSON";

}

这是支付调用类:

/**
 * Created by Administrator.
 * Created on 2018/3/27.
 * Description: 支付宝支付
 */
@RestController
public class AliPay {

    private static final Logger logger = LoggerFactory.getLogger(AliPay.class);

    public String aliPay(Map<String, Object> params) {
        //实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.SERVICE_URL, AliPayConfig.APPID,
                AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.INPUT_CHARSET, AliPayConfig.ALI_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(params.toString()));  //描述信息  添加附加数据
        model.setSubject(params.get("subject").toString()); //商品标题
        model.setOutTradeNo(params.get("orderId").toString()); //商家订单编号(我使用(订单号+时间戳:流水号))
        model.setTimeoutExpress("30m"); //超时关闭该订单时间
        model.setTotalAmount(params.get("amount").toString());  //订单总金额
        model.setProductCode("QUICK_MSECURITY_PAY"); //销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
        model.setSellerId(AliPayConfig.PARTNER); // 商家id
        request.setBizModel(model);
        request.setNotifyUrl(AliPayConfig.NOTIFY_URL);  //回调地址
        String orderStr = "";
        try {
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); //这里和普通的接口调用不同,使用的是sdkExecute
            orderStr = response.getBody();
            logger.info("=======>>>>>这是orderStr:" + orderStr); // 就是orderString 可以直接给客户端请求,无需再做处理。
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return orderStr;
    }

    @ResponseBody
    @RequestMapping(value = "/pay/alipay/notify", method={RequestMethod.POST,RequestMethod.GET}, produces="application/json;charset=utf-8")
    public String aliPay_notify(HttpServletRequest request) {
        Map requestParams = request.getParameterMap();
        logger.info("==============支付宝异步回调==============");
        //获取支付宝POST过来反馈信息
        Map<String, String> params = new HashMap<String, String>();
        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("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        logger.info("===>>>支付宝异步回调参数:" + params);
        // 2.封装必须参数
        String out_trade_no = request.getParameter("out_trade_no"); // 商户订单号
        logger.info("out_trade_no===>>>" + out_trade_no);
        String orderType = request.getParameter("body"); // 订单内容
        logger.info("orderType===>>>" + orderType);
        String tradeStatus = request.getParameter("trade_status"); // 交易状态
        logger.info("tradeStatus===>>>" + tradeStatus);
        try {
            // 3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
            //验证签名, 切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
            boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.INPUT_CHARSET, AliPayConfig.SIGN_TYPE);
            if (flag) {
                if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {
                    //附加数据
//                    String passback_params = URLDecoder.decode(params.get("passback_params"));
                    /**
                        这里实现你的订单更新操作
                    */
                    return "success";
                } else {
                    return "fail";
                }
            } else {
                logger.info("支付宝异步回调签名错误");
                return "fail";
            }
        } catch (AlipayApiException e) {
            // TODO Auto-generated catch block
            logger.info("======>>>这是支付宝异步回调异常:");
            e.printStackTrace();
        }
        return "fail";
    }

}

好了, 暂时支付宝java服务端开发遇到的一些问题, 多看看官方文档[App支付服务端文档]

如果遇到问题,最好去咨询技术客服,他们很给力的,给他们点赞.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值