沙箱环境-支付宝支付-springboot


1.沙箱地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info

记录APPID

查看商家和买家信息

网站支付文档地址:

alipay.trade.wap.pay(手机网站支付接口2.0) | API

支付宝开发助手文档地址:

开发助手简介 | 网页&移动应用

下载开发助手,生成公钥私钥

扫描二维码关注公众号,回复: 13359202 查看本文章

将私钥放入代码配置类中,应用公钥放到下图沙箱环境配置中:

保存设置后,获取支付宝公钥,加入代码配置中:

引入maven配置

com.alipay.sdkalipay-sdk-java4.10.218.ALL

样例代码配置:

public class AlipayConfig {


    /**
     * 支付宝网关地址  TODO
     */
    public static final  String PAY_GATEWAY="https://openapi.alipaydev.com/gateway.do";
    /**
     * 支付宝 APPID
     */
    public static final  String APPID="这是APPID,在沙箱应用的信息配置页面";

    /**
     * 应用私钥
     */
    public static final String APP_PRI_KEY = "这里写上应用的私钥,就是开发助手生成的那个私钥";

    /**
     * 支付宝公钥
     */
    public static final String ALIPAY_PUB_KEY = "这是支付宝公钥,就是在沙箱环境里面,设置好应用公钥保存设置后,下方展示的支付宝公钥";


    /**
     * 签名类型
     */
    public static final  String SIGN_TYPE="RSA2";


    /**
     * 字符编码
     */
    public static final  String CHARSET="UTF-8";


    private AlipayConfig(){

    }
    private volatile static AlipayClient instance = null;
    /**
     * 返回参数格式
     */
    public static final  String FORMAT="json";

    /**
     * 单例模式获取, 双重锁校验
     * @return
     */
    public static AlipayClient getInstance(){

        if(instance==null){
            synchronized (AlipayConfig.class){
                if(instance == null){
                    instance = new DefaultAlipayClient(PAY_GATEWAY,APPID,APP_PRI_KEY,FORMAT,CHARSET,ALIPAY_PUB_KEY,SIGN_TYPE);
                }
            }
        }
        return instance;
    }

}


测试调用:

  /**
     * 测试支付方法
     */
    @GetMapping("test_pay")
    public void testAlipay(HttpServletResponse response) throws AlipayApiException, IOException {

        HashMap<String,String> content = new HashMap<>();
        String no = UUID.randomUUID().toString();
        log.info("订单号:{}",no);
        content.put("out_trade_no", no);
        content.put("product_code", "FAST_INSTANT_TRADE_PAY");
		content.put("total_amount", String.valueOf("666.66"));
		content.put("subject", "水杯");
		content.put("body", "好看的水杯");
        content.put("timeout_express", "5m");

        AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
        request.setBizContent(JSON.toJSONString(content));
        request.setNotifyUrl(payUrlConfig.getAlipayCallbackUrl());
        request.setReturnUrl(payUrlConfig.getAlipaySuccessReturnUrl());

        AlipayTradeWapPayResponse alipayResponse  = AlipayConfig.getInstance().pageExecute(request);

        if(alipayResponse.isSuccess()){
            System.out.println("调用成功");

            String form = alipayResponse.getBody();

            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().write(form);
            response.getWriter().flush();
            response.getWriter().close();

        } else {
            System.out.println("调用失败");
        }
    }

浏览器输入地址测试:

ip:port/xxx/test_pay

输入沙箱环境中的沙箱买家账号和登录密码

点击确认付款,输入买家支付密码 。然后完成支付。

以下是关于支付成功后的接口回调部分

支付宝回调接口沙箱环境配置:

1.见 小米球内网穿透配置 文章。

2.沙箱环境配置回调接口

3.代码配置中增加回调配置 

4.回调代码段

    @PostMapping("alipay")
    public String alipayCallback(HttpServletRequest request, HttpServletResponse response){
        //将异步通知中收到的所有参数存储到map中
        Map<String,String> paramsMap = convertRequestParamsToMap(request);
        log.info("支付宝回调通知结果:{}",paramsMap);
        //调用SDK验证签名
        try {
            boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.ALIPAY_PUB_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGN_TYPE);
            if(signVerified){

                JsonData jsonData = productOrderService.handlerOrderCallbackMsg(ProductOrderPayTypeEnum.ALIPAY,paramsMap);

                if(jsonData.getCode() == 0){
                    //通知结果确认成功,不然会一直通知,八次都没返回success就认为交易失败
                    return "success";
                }

            }

        } catch (AlipayApiException e) {
            log.info("支付宝回调验证签名失败:异常:{},参数:{}",e,paramsMap);
        }

        return "failure";
    }

猜你喜欢

转载自blog.csdn.net/wnn654321/article/details/118229468