栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【无标题】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【无标题】

JAVA对接支付宝,实现支付功能

网站对接支付宝支付
沙盒开通
支付宝给我们提供了支付宝支付沙盒 供测试
注册沙盒可以自行 百度开通 这里不过多介绍
对接支付宝主要流程
我们在我们订单支付时给支付宝发送一个创建订单请求

在创建订单时创建支付订单

使用工具类创建供前端订单页面使用的数据包
支付宝配置类↓

public class AlipayConfig {
    // 服务器异步通知页面路径
    public static String notify_url = "http://";
    // 页面跳转同步通知页面路径
    public static String return_url = "http://HEADURL/success.html";
    // 签名方式
    public static String sign_type = "RSA2";
    // 字符编码格式
    public static String charset = "utf-8";
    // 支付宝网关(沙盒)
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}

工具类↓

public static String pay(AlipayInfo info, PayBill bill){
    try {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(
            //                    支付宝支付网关地址 配置类中取
            AlipayConfig.gatewayUrl,
            //                      商家的appid和key   数据库中取
            info.getAppid(),
            info.getMerchant_private_key(), "json",
            AlipayConfig.charset,
            info.getAlipay_public_key(),
            AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        //            同步回调地址  配置类中取
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        //            异步回调地址  配置类中取
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商户订单号,商户网站订单系统中唯一订单号,必填  //就是统一支付单单号
        String out_trade_no = bill.getUnionPaySn();
        //付款金额,必填
        String total_amount = bill.getMoney().toString();
        //订单名称,必填
        String subject = bill.getDigest();
        //商品描述,可空
        String body = bill.getDigest();
        //          这里不用修改
        alipayRequest.setBizContent("{"out_trade_no":""+ out_trade_no +"","
                                    + ""total_amount":""+ total_amount +"","
                                    + ""subject":""+ subject +"","
                                    + ""body":""+ body +"","
                                    + ""product_code":"FAST_INSTANT_TRADE_PAY"}");
        //请求数据包
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        return result;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

有了这个工具类根据注释凑齐相关参数就能给页面发送数据包进行支付了
数据包我们接收一下直接发送给前端页面
这个数据包是一个from表单 我们需要将这个from表单放到订单页面最上方(可以创建个div使用id进行追加) 保证此表单为第一个from表单
页面接收到表单会自动提交页面的第一个from表单(跳转页面关键)
回调
用户支付完成后支付宝会给我们两个回调地址
在页面中使用的是同步回调地址 意思就是说 支付完成后支付宝会帮我们自动跳转到我们指定好的页面中去
异步回调是向我们后台中发送一个post请求 告知我们已经支付完成
如果出现一些极端情况 同步异步都不行的话 我们可以自己去查询结果
接收回调接口

@PostMapping("/notify")
    public void payNotify(HttpServletRequest request){
        try {
            //获取支付宝POST过来反馈信息
            Map params = new HashMap();
            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] + ",";
                }
                //乱码解决,这段代码在出现乱码时使用
                valueStr = new String(valueStr);
                params.put(name, valueStr);
            }
            String orderSn = params.get("out_trade_no");
            AdoptOrder adoptOrder = adoptOrderService.queryByOrderSn(orderSn);
            AlipayInfo alipayInfo = alipayInfoService.getByShopId(adoptOrder.getShop_id());
            boolean signVerified = AlipaySignature.rsaCheckV1(params,alipayInfo.getAlipay_public_key(), AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名
//        boolean signVerified = false; //调用SDK验证签名

            //——请在这里编写您的程序(以下代码仅作参考)——

    
            if(signVerified) {//验证成功
                //商户订单号
                String out_trade_no = new String(request.getParameter("out_trade_no"));
                //支付宝交易号
                String trade_no = new String(request.getParameter("trade_no"));
                //交易状态
                String trade_status = new String(request.getParameter("trade_status"));
                if(trade_status.equals("TRADE_FINISHED")){
                    //判断该笔订单是否在商户网站中已经做过处理
                    //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                    //如果有做过处理,不执行商户的业务程序

                    //注意:
                    //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
                }else if (trade_status.equals("TRADE_SUCCESS")){
                    payBillService.paySuccess(orderSn);
                }
            }else {//验证失败
                //调试用,写文本函数记录程序运行情况是否正常
                //String sWord = AlipaySignature.getSignCheckContentV1(params);
                //AlipayConfig.logResult(sWord);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //——请在这里编写您的程序(以上代码仅作参考)——
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号