JAVA新支付宝支付(保姆级)

一如既往的简易

第一步

添加maven

 <!--        支付宝支付最新依赖-->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.22.34.ALL</version>
            <scope>compile</scope>
        </dependency>

为了省事这里就一个配置文件

新建 AliPayConfig.java配置类


/**
 * 微信支付配置类
 */
public class AliPayConfig {


    /** 支付宝支付的appid */
    public static  String APP_ID = "xxxxxxxxxxx";

    /** 商户私钥 */
    public static  String  APP_PRIVATE_KEY = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
   
    //字符集
    public static   String CHARSET = "utf-8";

    //正式环境支付宝网关,如果是沙箱环境需更改成https://openapi.alipaydev.com/gateway.do
    public static String URL = "https://openapi.alipay.com/gateway.do";

    //加密方式
    public static String SIGN_TYPE = "RSA2";

    //配置证书
    public static String APP_CERT_PATH = "/xxxxxxxxxxx/appCertPublicKey_2021003113684123.crt";

    public static String ALIPAY_CERT_PATH = "/xxxxxxxxxxx/alipayCertPublicKey_RSA2.crt";

    public static String ALIPAY_ROOT_CERT_PATH = "/xxxxxxxxxxx/alipayRootCert.crt";

}

新建 AliPayConfig.java配置类

/**
 * @author 影子
 */
public interface AliPaymentService
{

    /**
     * 支付宝商品支付
     * @param alipayParam    订单接收对象
     * @return
     */
    public Map<String, Object> alidoUnifiedOrder(String orderNumber) throws Exception;


    /**
     * 支付宝支付回调
     * @param request
     * @return
     */
    public String aliPayNotify( HttpServletRequest request);

   

}

新建 AlipaymentServiceImpl.java配置类


@Service
@Slf4j
public class AlipaymentServiceImpl implements AliPaymentService {

     //支付宝支付回调  省事0.0
    public static final String ALI_PAY_NOTIFY_URL = "https://xxxxxxxx/aliPayNotify";


 /**
     * 支付宝商品订单支付
     *
     * @param payParam
     * @return
     * @throws Exception
     */
    @Override
    public Map<String,Object> alidoUnifiedOrder(String orderNumber) throws Exception {

        Map<String,Object> map = new HashMap<>();

        //支付总金额
        BigDecimal totalPrice = BigDecimal.ZERO;
        //你的订单金额
        totalPrice = totalPrice.add(BigDecimal.valueOf(600));

    try {
        //构造client
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        //设置网关地址
        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
        //设置应用Id
        certAlipayRequest.setAppId(AliPayConfig.APP_ID);
        //设置应用私钥
        certAlipayRequest.setPrivateKey(AliPayConfig.APP_PRIVATE_KEY);
        //设置请求格式,固定值json
        certAlipayRequest.setFormat("json");
        //设置字符集
        certAlipayRequest.setCharset(AliPayConfig.CHARSET);
        //设置签名类型
        certAlipayRequest.setSignType(AliPayConfig.SIGN_TYPE);
        //设置应用公钥证书路径
        certAlipayRequest.setCertPath(AliPayConfig.APP_CERT_PATH);
        //设置支付宝公钥证书路径
        certAlipayRequest.setAlipayPublicCertPath(AliPayConfig.ALIPAY_CERT_PATH);
        //设置支付宝根证书路径
        certAlipayRequest.setRootCertPath(AliPayConfig.ALIPAY_ROOT_CERT_PATH);
        //构造client
        DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody("我是测试数据");
        //App支付测试Java
        model.setSubject("影子");
        /*setTimeoutExpress :该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,
                d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。
                该参数数值不接受小数点, 如 1.5h,可转换为 90m。*/
        model.setTimeoutExpress("30m");
        //请保证OutTradeNo值每次保证唯一
        model.setOutTradeNo(“2017090080001939235”);//商品订单(2017090080001939235 )
        //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
        model.setTotalAmount("0.01");
        request.setBizModel(model);
        //商户外网可以访问的异步地址
        request.setNotifyUrl(ALI_PAY_NOTIFY_URL);
        
        try {
                //这里和普通的接口调用不同,使用的是sdkExecute
                AlipayTradeAppPayResponse responses = alipayClient.sdkExecute(request);
                map.put("code",200);
                map.put("msg","操作成功");
                map.put("data",responses.getBody());
                return map;
                //就是orderString 可以直接给客户端请求,无需再做处理。
            } catch (AlipayApiException e) {
                e.printStackTrace();
                map.put("code",500);
                map.put("msg","下单失败");
                return map;
            }
        
     } catch (Exception e) {
            e.printStackTrace();
            log.info("异常==>",e);
            map.put("code",500);
            map.put("msg","支付异常");
            return map;
     }

    
    }


     /**
     * 支付宝支付回调
     * @param request
     * @return
     */
    @Override
    public String aliPayNotify(HttpServletRequest request) {
        //支付宝交易号
        String payTradeNo= "";
        //获取支付宝POST过来反馈信息
        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 );
        }
        payTradeNo =  params.get("trade_no");

    try {
           //验签
            boolean flag = AlipaySignature.rsaCertCheckV1(params,AliPayConfig.ALIPAY_CERT_PATH,AliPayConfig.CHARSET,AliPayConfig.SIGN_TYPE );
            if (flag){//验签成功
                //商户订单号
                String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
                //交易状态
                String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
                //查询订单逻辑省略....
            if (trade_status.equals("TRADE_SUCCESS")) {
                    if (out_trade_no != null) {
                       // 注意特殊情况:订单已经退款,但收到了支付结果成功的通知,不应把商户的订单状态从退款改成支付成功
                       // 注意特殊情况:微信服务端同样的通知可能会多次发送给商户系统,所以数据持久化之前需要检查是否已经处理过了,处理了直接返回成功标志
                       //业务数据持久化
                       //业务逻辑省略....

                        //必须返回SUCCESS 不然支付宝收不到成功信息会再次请求回调
                        return "SUCCESS";
                    }
                }
            }
            return "500";
        } catch (AlipayApiException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;

}
Controller类贴一下吧 照顾一下迷的“小”朋友
     /**
     * 支付宝商品支付
     * @param orderNumber
     * @return
     * @throws Exception
     */
    @PostMapping("/alidoUnifiedOrder")
    public Map<String,Object> alidoUnifiedOrder(String orderNumber) throws Exception {
        Map<String,Object> map = aliPaymentService.alidoUnifiedOrder(orderNumber);
        return map;
    }


     /**
     * 商品订单支付回调
     * @param request
     * @return
     */
    @PostMapping("/aliPayNotify")
    @ResponseBody
    public String aliPayNotify( HttpServletRequest request) {
        String code = aliPaymentService.aliPayNotify(request);
        return code;
    }

到这就结束了 够简单吧 !复制粘贴即可一如既往没其它依赖

你学废了吗?

猜你喜欢

转载自blog.csdn.net/qq_37544675/article/details/130661483