ali支付服务端对接

帅比萌擦擦* 提交于 2019-11-26 10:15:52

引入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)-->查看应用公钥就是上图验签工具的 商户应用公钥
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!