请选择 进入手机版 | 继续访问电脑版
点击联系客服
客服QQ:509006671 客服微信:mengfeiseo

广州老站长门户

 找回密码
 立即注册
查看: 61|回复: 50

支付宝支付开发代码-java版本

[复制链接]

1

主题

1

帖子

-7

积分

限制会员

积分
-7
发表于 2021-4-13 21:38:40 | 显示全部楼层 |阅读模式
package  com  . yz.com  mons  . settlement  . channel  . Ali;

import  com  . Alibaba  . fastjson  . JSON  object;

import  com  . AliPay  . API  . alipayapiexception;

import  com  . AliPay  . API  . alipayclient;

import  com  . AliPay  . API  . defaultalipayclient;

import  com  . AliPay  . API  . domain  . alipaytradeappaymodel;

import  com  . AliPay  . API  . internal  . util  . alipaysignature;

import  com  . AliPay  . API  . request  . alipaytradeappayrequest;

import  com  . AliPay  . API  . request  . alipaytradequeryrequest;

import  com  . AliPay  . API  . response  . alipaytradeappayresponse;

import  com  . AliPay  . API  . response  . alipaytradequeryresponse;

import  lombok  . extern  . slf4j  . slf4j;

importorg  . springframework  . data  . redis  . core  . stringredistemplate;

importorg  . springframework  . stereo  type  . service;

importorg  . springframework  . util  . stringutils;

import  Java  . math  . bigdecimal;

importjava  . util  . hashmap;

importjava  . util  . map;

importjava  . util  . optional;

@Slf4j

@Service('ALI_APP_PAY  ')

publicclassaliappayimplementspayfacade  {

privatefinalapplicationpropertiesapplicationproperties;

privatefinalchargeorderrepositorychargeorderrepository;

privatefinalpayaccountconfigrepositorypayaccountconfigrepository;

privatefinalstringredistemplatestringredistemplate;

privatefinalpackagepayaccountrepositorypackagepayaccountrepository;

privatefinalpackageinforepositorypackageinforepository;

privatefinalnotifyutilnotifyutil;

/* *

*帐户缓存密钥

*/

privatefinalstringconfigkey=' pay  _ config  ';

publicaliappay(applicationpropertiesapplicationproperties、chargeorderrepositorychargeorderrepository、

payaccountconfigrepositorypayaccountconfigrepository、stringredistemplatestringredistemplate、

packagepayaccountrepositorypackagepayaccountrepository、notifyutilnotifyutil、packageinforepositorypackageinforepository

this  . application  properties=application  properties;

this  . chargeorderrepository=chargeorderrepository;

this  . payaccountconfigrepository=payaccountconfigrepository;

this  . stringredistemplate=stringredistemplate;

this  . packagepayaccountrepository=packagepayaccountrepository;

This.notifyUtil=notifyUtil

this  . packageinforepository=packageinforepository;

}

/* *

*支付宝订购系统
一下单
     * @param payPreParam
     * @return
     */
    @Override
    public PayPreResult unifiedOrder(PayPreParam payPreParam) {
        PayPreResult payPreResult = new PayPreResult();
        payPreResult.setOrderNo(payPreParam.getOrderNo());
        payPreResult.setOrderStatus(GoldFlowStatus.SUCCESS);
        payPreResult.setPayChannel(payPreParam.getPayChannelCode());
        PayAccountConfig payAccountConfig = payPreParam.getPayAccountConfig();
        String orderNo = payPreParam.getOrderNo();
        AttachParam attachParam = payPreParam.getAttachParam();
        String body = attachParam.getBody();
        // 分, 需要转换成元
        Long orderAmount = payPreParam.getOrderAmount();
        String amount = new BigDecimal(orderAmount).divide(new BigDecimal("100")).toString();
        //1  实例化客户端
        AlipayClient alipayClient = getAlipayClient(payAccountConfig);
        //2  实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //3  SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setSubject(body);
        model.setOutTradeNo(orderNo);
        // 超时时间十五分钟
        model.setTimeoutExpress("15m");
        model.setTotalAmount(amount);
        model.setProductCode("QUICK_MSECURITY_PAY");
        request.setBizModel(model);
        request.setNotifyUrl(notifyUtil.getNotifyUrl(payPreParam.getAttachParam().getPackageName(), ChargeOrderType.ALI_APP_PAY));
        try {
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            payPreResult.setPayInfo(response.getBody());
        } catch (AlipayApiException e) {
            e.printStackTrace();
            payPreResult.setOrderStatus(GoldFlowStatus.REJECT);
            payPreResult.setPayInfo("");
        }
        return payPreResult;
    }
    /**
     * 订单查询
     * @param payQueryParam
     * @return
     */
    @Override
    public PayQueryResult orderQuery(PayQueryParam payQueryParam) {
        PayQueryResult payQueryResult = new PayQueryResult();
        payQueryResult.setOrderStatus(GoldFlowStatus.PROCESSING);
        payQueryResult.setPayMsg("请求状态未知");
        String orderNo = payQueryParam.getOrderNo();
        PayAccountConfig payAccountConfig = payQueryParam.getPayAccountConfig();
        AlipayClient alipayClient = getAlipayClient(payAccountConfig);
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        request.setBizContent("{\"out_trade_no\": " + orderNo + "}");
        try {
            AlipayTradeQueryResponse response = alipayClient.execute(request);
            if (response.isSuccess()) {
                String tradeStatus = response.getTradeStatus();
                if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)){
                    payQueryResult.setOrderStatus(GoldFlowStatus.SUCCESS);
                } else if ("TRADE_CLOSED".equals(tradeStatus)) {
                    payQueryResult.setOrderStatus(GoldFlowStatus.REJECT);
                }
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return payQueryResult;
    }
    /**
     * 支付宝回调
     * @param verifyParam
     * @return
     */
    @Override
    public VerifyResult orderVerify(VerifyParam verifyParam) {
        VerifyResult verifyResult = new VerifyResult();
        verifyResult.setOrderStatus(GoldFlowStatus.PROCESSING);
        verifyResult.setResponseStr("failure");
        Map parameterMap = verifyParam.getParameterMap();
        Map newMap = mapConvert(parameterMap);
        String orderNo = newMap.get("out_trade_no");
        ChargeOrder repository = chargeOrderRepository.findByOrderNo(orderNo);
        String aliPublicKey = getAliPublicKey(repository.getPackageName(), repository.getCtype());
        verifyResult.setOrderNo(orderNo);
        try {
            boolean isVerfied = AlipaySignature.rsaCheckV1(newMap, aliPublicKey, "UTF-8", SystemContants.ALI_SIGN_TYPE);
            if (isVerfied) {
                // 延签成功
                String orderStatus = newMap.get("trade_status");
                if ("TRADE_SUCCESS".equals(orderStatus) || "TRADE_FINISHED".equals(orderStatus)){
                    verifyResult.setOrderStatus(GoldFlowStatus.SUCCESS);
                    verifyResult.setResponseStr("success");
                    // 支付包订单金额为元,转化成分
                    String totalAmount = newMap.get("total_amount");
                    Long orderAmount = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).longValue();
                    verifyResult.setOrderAmount(orderAmount);
                } else if ("TRADE_CLOSED".equals(orderStatus)){
                    verifyResult.setOrderStatus(GoldFlowStatus.REJECT);
                    verifyResult.setResponseStr("success");
                }
            } else {
                log.error("ali order verify check sign append error : {}", orderNo);
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return verifyResult;
    }
    private AlipayClient getAlipayClient(PayAccountConfig payAccountConfig){
        AlipayClient alipayClient = new DefaultAlipayClient(applicationProperties.getPay().getAliAppPayUrl(),
            payAccountConfig.getAppId(),
            payAccountConfig.getAliPrivateKey(),
            "json", "UTF-8",
            payAccountConfig.getAliPublicKey(),
            SystemContants.ALI_SIGN_TYPE);
        return alipayClient;
    }
    /**
     * 转换Map
     * @param map
     * @return
     */
    private static Map mapConvert(Map map){
        Map resultMap = new HashMap();
        for (String key : map.keySet()) {
            resultMap.put(key, map.get(key)+"");
        }
        return resultMap;
    }
    private String getAliPublicKey(String packageName, String plant) {
        PayAccountConfig payAccountConfig;
        Object configObj = stringRedisTemplate.opsForHash().get(configKey, packageName + "." + plant);
        if (null != configObj) {
            payAccountConfig = JSONObject.parseObject(configObj.toString(), PayAccountConfig.class);
            return payAccountConfig.getAliPublicKey();
        } else {
            PackageInfo packageInfo = packageInfoRepository.findByPackageName(packageName);
            PackagePayAccount packagePayAccount = packagePayAccountRepository.findByPackageIdAndPlant(packageInfo.getId(), plant);
            Optional optional = payAccountConfigRepository.findById(packagePayAccount.getAccountId());
            payAccountConfig = optional.get();
            payAccountConfig.setPlant(plant);
            payAccountConfig.setPackageName(packageName);
            return payAccountConfig.getAliPublicKey();
        }
    }
}
回复

使用道具 举报

0

主题

813

帖子

-325

积分

限制会员

积分
-325
发表于 2021-4-13 21:39:29 | 显示全部楼层
不错不错,很好哦
回复

使用道具 举报

3

主题

760

帖子

-192

积分

限制会员

积分
-192
发表于 2021-4-13 22:01:29 | 显示全部楼层
难得一见的好帖
回复

使用道具 举报

0

主题

864

帖子

-313

积分

限制会员

积分
-313
发表于 2021-4-13 22:21:36 | 显示全部楼层
支持一下
回复

使用道具 举报

0

主题

832

帖子

-287

积分

限制会员

积分
-287
发表于 2021-4-13 22:43:19 | 显示全部楼层
不错不错,很好哦
回复

使用道具 举报

0

主题

795

帖子

-254

积分

限制会员

积分
-254
发表于 2021-4-13 23:06:05 | 显示全部楼层
相当不错,感谢无私分享精神!
回复

使用道具 举报

0

主题

798

帖子

-312

积分

限制会员

积分
-312
发表于 2021-4-13 23:27:16 | 显示全部楼层
沙发!沙发!
回复

使用道具 举报

1

主题

753

帖子

-267

积分

限制会员

积分
-267
发表于 2021-4-13 23:51:22 | 显示全部楼层
相当不错,感谢无私分享精神!
回复

使用道具 举报

1

主题

806

帖子

-260

积分

限制会员

积分
-260
发表于 2021-4-14 06:05:48 | 显示全部楼层
学习了,不错,讲的太有道理了
回复

使用道具 举报

0

主题

807

帖子

-277

积分

限制会员

积分
-277
发表于 2021-4-14 06:25:50 | 显示全部楼层
不错,支持下楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|无图版|手机版|小黑屋|广州@IT精英团

GMT+8, 2021-5-8 12:48 , Processed in 0.106043 second(s), 40 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表