• java ali支付服务端对接


    引入SDK:

    <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
    <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.1.1</version>
    </dependency>
    <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-green</artifactId>
    <version>3.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
    <dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.10</version>
    </dependency>
    <dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.0.0</version>
    </dependency>

    预支付订单:

    public Map<String,Object> alipay(NyOrder order) {
    //实例化客户端
    AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);//此处的SIGN_TYPE是"RSA2"算法
    //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
    AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
    //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
    AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
    model.setBody("xxxxx"); //商品描述
    model.setSubject("xxxxx"); // 商品标题
    // 雪花算法生成订单号
    String tradeNo = String.valueOf(SnowFlake.getSnowFlake().nextId());
    model.setOutTradeNo(tradeNo); //订单号
    model.setTimeoutExpress("30m");// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。注:若为空,则默认为15d。
    model.setTotalAmount(order.getAmount().toString());//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
    /*model.setProductCode("xxxxxx");*///销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
    model.setSellerId(SELLER_ID);
    request.setBizModel(model);
    request.setNotifyUrl(NOTIFY_URL);//支付宝异步调用后台的url
    // 创建订单
    NyOrder nyOrder = new NyOrder();
    // 雪花算法生成订单号
    //生成订单部分
    LOGGER.info("开始生成订单...");
    nyOrderService.addUserOrder(nyOrder);
    LOGGER.info("生成订单完成!");
    try {
    //这里和普通的接口调用不同,使用的是sdkExecute
    AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
    // System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
    Map<String,Object> map=new HashMap<>();
    map.put("alisign",response.getBody());//前端是拿到此数据唤起支付
    map.put("tradeNo",tradeNo); //此处将订单返回给前端,前端拿到此订单号再进行查一遍
    return map;
    } catch (AlipayApiException e) {
    e.printStackTrace();
    PayCommonUtil.saveLog("/opt/ny/logs/aliay.txt", e.getErrMsg());
    return null;
    }

    }
    回调
    @PostMapping(value = "/alipayNotify")
    @ResponseBody
    public String AlipayCallBack(HttpServletRequest request) throws Exception {
    LOGGER.info("开始回调...");
    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] + ",";
    }
    //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化//
    //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8");
    params.put(name, valueStr);
    }
    String notify_id = request.getParameter("notify_id");
    String notify_type = request.getParameter("notify_type");
    // 商户订单号
    String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
    String trade_status = request.getParameter("trade_status");
    // 支付宝交易号
    String out_trade_no = request.getParameter("out_trade_no");
    if (notify_id != "" && notify_id != null) {
    if (notify_type.equals("trade_status_sync")) {
    int exeCount = 0;
    // 验签
    boolean flag = AlipaySignature.rsaCheckV1(params, AliPayServiceImpl.ALIPAY_PUBLIC_KEY, "UTF-8", "RSA2");
    if (true == flag && trade_status.equals("TRADE_SUCCESS")) {
    LOGGER.info("TRADE_SUCCESS进入业务执行代码");
    exeCount = aliPayService.notifyExe(trade_no, out_trade_no);
    LOGGER.info("TRADE_SUCCESS执行结果:" + exeCount);
    if (exeCount > 0) {
    return "success";
    } else {
    return "fail";
    }
    } else {
    return "sign fail";
    }

    }

    } else {
    return "fail";
    }
    return "fail";
    }

    主要的部分:
    阿里验签参数配置:

    配置按照支付宝管理后台申请的 配置就可
    但是有点区别也是 比较坑的一点是:其中绿色框是 验签 工具生成的私钥 紫色框 是 支付宝管理平台的 支付宝公钥不是应用公钥哦!!!!!切记) 如下图

    应该公钥是 验签 工具生成的对应的 商户应用公钥 (开放平台秘钥 查看支付宝公钥 貌似是不能修改的)

    支付宝管理后台 的开放平台秘钥--》RSA(SHA256)-->查看应用公钥就是上图验签工具的 商户应用公钥
    PS:(支付宝配置 私钥 公钥 使用验签工具生成 同时 公钥要在支付宝管理后台设置  其余的不用操作引入支付宝SDK 在配置AliConfig的时候 其中里面的私钥是 验签工具生成的私钥 公钥是支付宝公钥(切忌不是应用公钥))
    坑: 就是验签部分
    具体:
    1.下载验签工具
    2.生成秘钥(如上图商户应用私钥,商户应用公钥)
    3.商户应用私钥复制黏贴在AlipayConfig的app_private_key字段,商户应用公钥复制黏贴在 支付宝管理平台--》开放平台秘钥--》RSA(SHA256)查看应用公钥中
    4.复制黏贴 支付宝管理平台--》开放平台秘钥==》查看支付宝公钥 放在AlipayConfig的alipay_public_key 字段
    5.预支付的时候 需要加签
    AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); 其中SIGN_TYPE为RSA2 其余的参数 按照申请的管理平台自行配置
    6.回调的时候验签
     AlipaySignature.rsaCheckV1(params, AliPayServiceImpl.ALIPAY_PUBLIC_KEY, "UTF-8", "RSA2");
    7.回调的内容返回为success 否则阿里会间歇性回调 (或者用字节流打印success)
  • 相关阅读:
    手动安装配置Android Studio
    编程加密总结
    偏执却管用的10条Java编程技巧
    C++中一个class类对象占用多少内字节(7个例子,很清楚)
    qt 透明度设置(setWindowOpacity 和 setAutoFillBackground 和 带透明度的画刷填充就好了)
    虚函数的作用是实现多态性,多态性是将接口与实现进行分离(函数级别的接口,注意第二个例子)
    QT Linux Demo程序编译
    线性渐变、辐射渐变、角度渐变-QLinearGradient,QRadialGradient,QConicalGradient
    Linux Kernel
    .NET框架
  • 原文地址:https://www.cnblogs.com/austinspark-jessylu/p/11317684.html
Copyright © 2020-2023  润新知