天天看点

Sprinboot支付宝h5支付(java版)

1、准备工作

支付宝开发api(手机网站支付):https://docs.open.alipay.com/api_1/alipay.trade.wap.pay

1.1、登录蚂蚁金服开放平台

https://open.alipay.com/platform/manageHome.htm

1.2、选择控制台 -》网站&移动应用

Sprinboot支付宝h5支付(java版)

1.3创建应用

Sprinboot支付宝h5支付(java版)

1.4添加能力

Sprinboot支付宝h5支付(java版)

1.5下载签名工具,地址:https://docs.open.alipay.com/291/105971/ ,下载windows,点击:RSA签名验签工具

1.6点击生成秘钥,生成商户私钥和应用秘钥,并且会以文本(txt)的方式保存起来

生成秘钥过程具体看支付宝文档

1.7 拿到APPID 应用公钥私钥支付宝公钥 回到商家中心 绑定APPID 提交审核 审核通过应用处于已上线才能进行测试对接

Sprinboot支付宝h5支付(java版)

2、代码开发

2.1 引入java sdk包

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.7.26.ALL</version>
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
</dependency>           

2.2 开发配置类

不使用应用公钥

public class PayConfig {
    // 应用ID
    public static String APP_ID = "2021003124687304";
    // 应用私钥
    public static String MERCHANT_PRIVATE_KEY = "MIIEvQIBADA****";
    // 应用公钥
    public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9***";
    //    支付宝公钥
    public static String ZFB_PUBLIC_ID = "MIIBIjANBgkqhkiG9*****";
    //	异步通知   【稍后会进行解释】
    public static String notify_url = "http://**.**.**/api/pay/aliCallback";

    // 支付成功后出现几秒的回调页面
    public static String return_url = "****";

    // 签名方式
    public static String SIGN_TYPE = "RSA2";

    // 字符编码格式
    public static String CHARSET = "utf-8";

    //数据类型
    public static String format = "json";

    //销售产品码,商家和支付宝签约的产品码,默认值为:QUICK_WAP_WAY
    public static String productCode = "QUICK_WAP_WAY";

    // 支付宝网关  alipaydev 为沙箱网关
    public static String GATEWAYURL = "https://openapi.alipay.com/gateway.do";

  
}           

2.3拉起支付代码

/**
     * 支付宝支付
     *
     * @return
     */
    private String aliPay(NftOrder nftOrder) throws AlipayApiException {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(PayConfig.GATEWAYURL, PayConfig.APP_ID,
                PayConfig.MERCHANT_PRIVATE_KEY, "json", PayConfig.CHARSET, PayConfig.ZFB_PUBLIC_ID,
                PayConfig.SIGN_TYPE);
        //该笔订单允许的最晚付款时间
        String timeout = "30m";
        //设置请求参数
        String content = "{\"out_trade_no\":\"" + "系统订单号"+ "\","
                + "\"total_amount\":\"" + "0.01" + "\","
                + "\"subject\":\"" + "商品名称") + "\","
                + "\"timeout_express\":\"" + timeout + "\","
                + "\"body\":\"" + "商品描述" + "\","
                + "\"product_code\":\"" + PayConfig.productCode + "\"}";
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
        alipayRequest.setReturnUrl(PayConfig.return_url);
        alipayRequest.setNotifyUrl(PayConfig.notify_url);
        alipayRequest.setBizContent(content);
        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        return result;
    }           

2.4这时候就会在网页让你打开支付宝 进行支付

效果图

Sprinboot支付宝h5支付(java版)

2.5支付成功回调接口 接口必须对外开放能在公网访问到 这是阿里云调用你的接口

@ApiOperation(value = "H5支付支付宝回调", notes = "H5支付支付宝回调")
    @PostMapping(value = "/aliCallback")
    @UnAuthentication
    public JsonResult aliCallback(HttpServletRequest request) throws AlipayApiException {
        System.out.println("/aliCallback进入支付宝PC异步回调");
        Map<String, String> params = new HashMap<String, String>();
        //从支付宝回调的request域中取值
        Map<String, String[]> requestParams = request.getParameterMap();
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = iter.next();
            String[] values = 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"), "gbk");
            params.put(name, valueStr);
        }
        System.out.println(request.toString());
        System.out.println(params.toString());
        //商品订单号
        String out_trade_no = request.getParameter("out_trade_no"); // 商户订单号
        String trade_no = request.getParameter("trade_no"); // 流水号
        System.out.println(out_trade_no);
        // 当前交易状态
        String tradeStatus = request.getParameter("trade_status"); //交易状态
        // 支付金额
        String totalAmount = request.getParameter("total_amount"); //交易状态
        // 支付时间
        String payDate = request.getParameter("gmt_payment"); //交易状态
        //3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
        boolean signVerified = AlipaySignature.rsaCheckV1(params, PayConfig.ZFB_PUBLIC_ID, PayConfig.CHARSET,
                PayConfig.SIGN_TYPE);
        if (signVerified) {
            System.out.println("验签通过");
            //验签通过
            if (tradeStatus.equals("TRADE_SUCCESS")) {
                //支付成功后的业务处理
                System.out.println("TRADE_SUCCESS");
                return payService.notifyPcOrder(out_trade_no, trade_no);
            }
        } else { //验签不通过
            System.out.println("验证失败");
            return new JsonResult().setSuccess(false).setMsg("验证失败");
        }
        System.out.println("支付失败");
        return new JsonResult().setSuccess(false).setMsg("支付失败");
    }           

 2.6退款接口

3.uniapp支付

uni.request({
    url: '后端支付下单接口地址',
    method: 'POST',
    success: (res)=>{
        // 将接口返回的form表单显示到页面
   		document.querySelector('body').innerHTML = res.data;
   		// 调用submit方法
   		document.forms[0].submit()
    }
});2