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();    // 雪花算法生成主键id    nyOrder.setId(String.valueOf(SnowFlake.getSnowFlake().nextId()));    nyOrder.setOrderNum(tradeNo);    nyOrder.setAmount(new BigDecimal(order.getAmount().toString()));    nyOrder.setPayType((byte) 1);    nyOrder.setUserId(order.getUserId());    NyUser nyUser = nyUserService.queryUserInfoByUserId(order.getUserId());    if (null != nyUser) {        nyOrder.setCpsInviteCode(nyUser.getCpsInviteCode());    } else {        nyOrder.setCpsInviteCode("");    }    nyOrder.setNCoin(new BigDecimal(order.getAmount().toString()).multiply(new BigDecimal(selfPropertiesUtil.getRmbTransferNCoinRation())).intValue());    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")@ResponseBodypublic Invoke 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] + ",";        }        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");//对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执行结果");            }            if(exeCount>0){                return Invoke.success(0,"xxxxx",null);            }else{                return Invoke.success(-1,"xxxxx",null);            }        }

    }    return Invoke.success(0,"xxxxx",null);

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

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

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

支付宝管理后台 的开放平台秘钥--》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");

原文地址:https://www.cnblogs.com/austinspark-jessylu/p/11317684.html

时间: 2024-10-29 17:22:05

ali支付服务端对接的相关文章

google支付服务端订单验证PHP代码

之前有转发一则关于google支付服务端验证的文章,今天把之前研究出得服务端订单支付验证代码(PHP版本)贴出来大家分享 在进行服务端交易验证之前,需要到google api consle后台https://console.developers.google.com开通google play developer api并获取请求api证书priket.p12文件: 交易状态API官方文档:https://developers.google.com/android-publisher/api-re

关于支付宝app支付服务端的实现-Java版

前言 最近在工作中需要使用支付宝app支付,在初次使用过程中也不可避免的出现了一些问题,那么本次随笔主要是概述支付宝app支付服务端的整个实现过程以及就服务端出现的一些问题做一些总结. 1.准备工作 1.1 入驻蚂蚁金服开放平台 https://open.alipay.com/platform/home.htm 1.2 创建应用 首先需要创建一个应用. 然后需要设置应用公钥. 下载支付宝密钥生成器.生成成功之后将公钥复制到这里. 最后提交审核,等待. 2.Maven依赖 首先需要下载SDK,ht

微信支付服务端开发

前言 最近应公司业务需求,把微信支付完成了,当然已经顺利上线.但是开发的过程是也是踩了很多坑,下面我就先说说开发流程,以及在开发中遇到的大大小小的坑. 开发流程 首先,看一下微信开方平台关于支付的一个时序图,如下: 微信支付时序图https://pay.weixin.qq.com/wiki/doc/api/app/app.php 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付. 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口.参见[统一

支付宝支付与微信支付服务端回调notify_url数据的区别

这两天优化了一下支付宝支付和微信支付订单回调的问题,之前我们的订单都是用手动回调给服务器,现在改成支付宝和微信原生的异步回调,结果并没有像我们想象的那么简单,支付宝是很顺利的解决回调,用一般的方式接收即可,但是微信接收时用普通的接收方式是不行的必须用另一种方式,如下且看: 支付宝和微信的回调地址 notifyUrl = RequestUrl.BASE_URL+"order/order_payment"+"?order_code="+orderCode; 服务器端是P

Ali OSS服务端签名直传并设置上传回调

服务端签名直传并设置上传回调 背景 请参考 Web端直传实践 里的背景介绍. 当采用服务端签名后直传方案后,问题来了,用户上传数据后,很多场景下,应用服务器都要知道用户上传了哪些文件,文件名字,甚至如果是图片的话,图片的大小等.为此OSS开发了上传回调功能. 用户的请求逻辑 用户向应用服务器取到上传policy和回调设置. 应用服务器返回上传policy和回调. 用户直接向OSS发送文件上传请求. 等文件数据上传完,OSS给用户Response前,OSS会根据用户的回调设置,请求用户的服务器.

微信app支付,服务端对接

首先,文档不给力,不吐槽了. 遇到的坑如下: 1. mch_id和appid没有关联关 系 这个没有花太久,参考了csdn某君的建议,直接邮件给相关技术团队([email protected]). 告知,其实对的mch_id是多少. (帐号管理比较烂还是为了安全原因,总之无从查询这个对应关系,必需邮件) 2. 签名不对 所有算法按照规定来做的,生成的签名也跟调试工具(https://pay.weixin.qq.com/wiki/tools/signverify/)生成的一致. 寻思了下,应该是商

支付宝(移动支付)服务端java版

所需支付宝jar包: sdk2-2.0.jar(点击下载) 工具类目录结构:   点击下载 商户信息已经公钥私钥的配置(公钥私钥的生成与支付宝商户平台配置请看官方文档:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1.https://doc.open.alipay.com/docs/doc.htm?spm=a219

微信APP支付服务端开发Java版(一)

一.准备工作 去微信开发者中心下载(扫码支付,里面的大部分代码是可以用的) https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1 选择UTF-8的版本copy到你的项目里面 找到Configure.java的类修改成public static String PAY_API = "https://api.mch.weixin.qq.com/pay/unifiedorder"; 下面正式进入代码部分 1 //初始化

小程序服务端集成微信支付

摘要: 换取openid->统一下单->发起支付,三步走,其中二次签名比较坑人. 该demo源码已托管到码云:http://git.oschina.net/dotton/lendoo-wx,欢迎下载. 理论上集成微信支付的全部工作可以在小程序端完成,因为小程序js有访问网络的能力,但是为了安全,不暴露敏感key,而且可以使用官方提供的现成php demo更省力,于是在服务端完成签名与发起请求,小程序端只做一个wx.requestPayment(OBJECT)接口的对接. 整体集成过程与JSAP