SpringCloud中进行支付宝接入支付

  1. 随着阿里的强大,微信与支付宝成为我们日常必不可少的应用软件,在程序开发中,为了提高用户的体验度以及对于客户方便的角度来说,都有支付宝以及微信支付的功能,下面,我就写一遍个人对支付宝介入支付的方法
    由于这里涉及到了个人的支付宝账户,我就用*号代替了,具体获取数据,我会告诉大家的^ - ^
    在这里插入图片描述
    百度搜索蚂蚁金服开发平台,进入点击如图所示
    第二步:配置密钥
    开 发 者 调 用 接 口 前 需 要 先 生 成 RSA 密钥, RSA 密钥包含应用私钥
    (APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台开发者中
    心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)。
    RSA 密钥生成工具下载地址:
    http://p.tb.cn/rmsportal_6680_secret_key_tools_RSA_win.zip?spm=a219a.7629140.0.0.TUzjw4&
    file=rmsportal_6680_secret_key_tools_RSA_win.zip
    密钥格式选择“PKCS8(Java 适用)”,密钥长度选择 2048,点击生成密钥然后点击“复
    制公钥”,以备后续步骤中使用。商户应用公钥必须上传至沙箱应用配置中的应用公钥部分,
    私钥配置在 shop-ali-pay-consumer 项目应用程序中。回到沙箱应用配置页面,
    点击“设置应用公钥”,
    在这里插入图片描述
    在这里插入图片描述
    拷贝刚刚复制的应用公钥到图中的文本框中,然后保存。平台将自动生成支付宝公钥,
    在这里插入图片描述
    图中多了一个“查看支付宝公钥”超链接,表示支付宝公钥生成成功。
    在这里插入图片描述
    点击“查看支付宝公钥”,此处应复制支付宝公钥以备在项目代码中使用。
    在这里插入图片描述

  2. 下载服务端 SDK(Java 版本),访问 https://docs.open.alipay.com/54/103419,打开如图 3.1
    所示页面:
    在这里插入图片描述
    选择java版本的下载
    以前是要进行下载demo的,现在可以不需要下载demo,它在中央仓库中已经有了对应的jar包,我们只需要在对的服务中,添加依赖jar包就行了
    在这里插入图片描述
    选择下载使用最多的jar包进行使用
    在这里插入图片描述
    这就是一些蚂蚁开发平台中需要我获取的一些配置了,同时我也需要在项目中进行配置

  3. 在项目中引入依赖,代码为:

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.7.4.ALL</version>
</dependency>

7.在项目中配置支付宝参数
在这里插入图片描述
其中 appID、url、alipayPublicKey 分别对应沙箱应用如下信息,
在这里插入图片描述
rsaPrivateKey 为密钥生成工具生成的商户应用私钥,应复制至此。
notifyUrl:商户网站请求支付宝进行支付之后,支付宝会主动通知商户支付结果,商户则
根据支付的结果进行进一步的操作,notifyUrl 即为支付宝进行通知商户支付结果要访问的
网址,注意此 url 必须为外网可以访问的地址,并且支付宝通知商户的方式采用异步进行
returnUrl:支付完成之后,支付宝需要跳转到商户页面进行支付结果的通知,此 url 即为
跳转请求地址,注意此处的通知为同步
url:商户进行支付宝支付时的请求地址
paymentSuccessUrl:程序中控制请求成功后跳转需要访问的地址
paymentFailureUrl:程序中控制请求失败后跳转需要访问的地址
其他参数的说明见地址 https://docs.open.alipay.com/203/107090/
至此,配置沙箱环境已完成。

8.最后我们就进入了代码的实现阶段了
第一步:编写信息配置类 AlipayConfig.java,用此类来读取配置信息中配置的参数,具体的
参数为上述第7项

public class AlipayConfig {
    public static String gatewayUrl="************************";
    public static String app_id="******************";
    public static String merchant_private_key="****************"
    public static String charset="UTF-8";
    public static String alipay_public_key="***************************";
    public static String sign_type="*********";
    public static String return_url="***************";
    public static String notify_url="**********************";
}

第二步:我们需要进行创建service和serviceimpl具体代码如下
service层

package com.kgc.service;

import com.kgc.dto.Dto;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface AliPayService {
    public Dto queryOrderByOrderNo(String orderNo, HttpServletResponse response)throws Exception;
}

在这里只是做个订单出插入,参数为订单号和http请求的response
serviceImpl的具体实现如下

package com.hui.service;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.hui.config.AlipayConfig;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.util.Random;

@Service
public class AliPayServiceImpl implements AliPayService {
    /*具体方法实现类*/
    @Override
    public String queryOrderByOrderNo(String orderNo, HttpServletResponse response) throws Exception {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
        //商户订单号,商户网站订单系统中唯一订单号,必填
        Random random= new Random();
        int i = random.nextInt(11);
        orderNo = i +"s";
        String out_trade_no =orderNo;
        //付款金额,必填
        String total_amount = "1";
        //订单名称,必填
        String subject = "银票购买";
        //商品描述,可空
        String body = "";
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"total_amount\":\""+ total_amount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\""+ body +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        //输出
        response.setContentType("text/html;charset=" + AlipayConfig.charset);
        response.getWriter().write(result);//直接将完整的表单html输出到页面
        response.getWriter().flush();
        response.getWriter().close();
        return null;
    }
}

最后我们写一个controller作为我们的控制器,进行调用服务
ApiPayController具体代码如下

package com.hui.orderController;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;

import com.hui.config.AlipayConfig;
import com.hui.service.AliPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@RestController
public class AliPayController {
    @Autowired
    private AliPayService aliPayService;
    @RequestMapping(value = "/p/queryOrderByOrderNo",method = RequestMethod.GET)
    public String queryOrderByOrderNo(@RequestParam(required = false) String orderNo, HttpServletResponse response ) throws Exception {
        return aliPayService.queryOrderByOrderNo(orderNo,response);
    }
    @RequestMapping(value = "/tests",method = RequestMethod.GET)
    public String tests(){
        return "测试!";
    }

    @RequestMapping(value = "/return",method = RequestMethod.GET)
    public void returnPay(HttpServletRequest request,HttpServletResponse response) throws IOException, AlipayApiException {

        //获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map<String,String[]> requestParams = request.getParameterMap();
        for (Iterator<String> 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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用
            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }

        boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

        //——请在这里编写您的程序(以下代码仅作参考)——
        if(signVerified) {
            //商户订单号
            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

            //支付宝交易号
            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

            //付款金额
            String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");
            response.getWriter().write("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount);//直接将完整的表单html输出到页面
            response.getWriter().flush();
            response.getWriter().close();
        }else {
            response.getWriter().write("验签失败");//直接将完整的表单html输出到页面
            response.getWriter().flush();
            response.getWriter().close();
        }


    }
    @RequestMapping(value = "/notify",method = RequestMethod.GET)
    public void notifyPay(HttpServletResponse response,HttpServletRequest request) throws IOException, AlipayApiException {
        //获取支付宝POST过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map<String,String[]> requestParams = request.getParameterMap();
        for (Iterator<String> 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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用
            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }

        boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

        //——请在这里编写您的程序(以下代码仅作参考)——

	/* 实际验证过程建议商户务必添加以下校验:
	1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
	2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
	3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
	4、验证app_id是否为该商户本身。
	*/
        if(signVerified) {//验证成功
            //商户订单号
            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

            //支付宝交易号
            String trade_no = new String(request.getParameter("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_FINISHED")){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
            }else if (trade_status.equals("TRADE_SUCCESS")){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //付款完成后,支付宝系统发送该交易状态通知
            }
            response.getWriter().write("success");//直接将完整的表单html输出到页面
            response.getWriter().flush();
            response.getWriter().close();
        }else {//验证失败
            response.getWriter().write("fail");//直接将完整的表单html输出到页面
            response.getWriter().flush();
            response.getWriter().close();
            //调试用,写文本函数记录程序运行情况是否正常
            //String sWord = AlipaySignature.getSignCheckContentV1(params);
            //AlipayConfig.logResult(sWord);
        }


    }
}

到这里我们已经完成了支付宝支付介入的开发了,如有不对,欢迎指正!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Spring Cloud接入ELK(Elasticsearch、Logstash、Kibana)可以通过集成Logstash和Kibana来实现。 首先,你需要在你的Spring Cloud项目添加Logstash依赖,例如fc-gateway-zuul、fc-service-portal和fc-service-screen。然后,你需要启动这些服务,并确保它们将日志输出到Logstash。 接下来,你需要启动Elasticsearch和Kibana。Elasticsearch是一个用于存储和搜索日志数据的分布式搜索和分析引擎,而Kibana则是一个用于可视化和分析日志数据的工具。你需要配置Logstash将数据发送到Elasticsearch,并使用Kibana来查看和搜索日志数据。 在你的Spring Cloud项目,你可以使用Logstash的日志输出功能将日志发送到Logstash服务器。通过在Logstash的配置文件指定接收日志的端口和协议,你可以让Logstash接收来自Spring Cloud应用程序的日志数据。然后,你可以在Kibana配置Logstash索引模式,以便对日志数据进行搜索和分析。 通过在你的Spring Cloud项目添加Logstash和Kibana的集成,你可以使用Kibana来查看和搜索你的应用程序的日志,以便于进行故障排除和性能监控。 在你的Spring Cloud项目,你可以通过在控制器方法添加日志语句,并确保将日志级别设置为合适的级别,从而记录日志。这样,你就可以在Kibana查看和搜索这些日志。 总之,通过在Spring Cloud项目集成Logstash和Kibana,你可以方便地将日志数据发送到Elasticsearch,并使用Kibana来可视化和分析这些日志数据。这样可以帮助你更好地理解和监控你的应用程序的运行情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值