淘东电商项目(60) -聚合支付(集成支付宝)

简介: 淘东电商项目(60) -聚合支付(集成支付宝)

引言

本文代码已提交至Github(版本号:256c7e9012276479da34d7d07fba707eb955710a),有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop

阅读本文前,有兴趣的同学可以参考我之前写的聚合支付的文章:

目前「淘东电商项目」的聚合支付模块,已经完成了银联支付的集成,接下来主要讲解集成支付宝,其实支付宝集成的原理跟银联支付大同小异,接下来不会详细的描述其细节代码,直接讲解集成流程。

本文目录结构:

l____引言

l____ 1. 支付宝沙箱环境相关申请

l________ 1.1 Demo下载地址以及沙箱环境

l________ 1.2 沙箱环境配置

l____ 2. 项目集成

l____ 3. 测试

1. 支付宝沙箱环境相关申请

1.1 Demo下载地址以及沙箱环境

本文不专门讲解支付宝Demo源码,有兴趣的同学们可以下载来自己看案例源码,支付宝案例SDK下载地址:https://docs.open.alipay.com/270/106291/

使用支付宝直接扫码进入沙箱环境即可配置,支付宝沙箱环境:https://openhome.alipay.com/platform/appDaily.htm


1.2 沙箱环境配置

扫码进入后,选择“自研开发服务”,并填写个人的相关信息:

点击确认之后,会进入沙箱配置环境:

公钥和秘钥使用支付宝的生成工具生成,本文不再详述,具体可以参考我的博客:《如何配置支付宝沙箱环境》

2. 项目集成

1.新增taodong-shop-alipay-plugin插件模块:

2.新增模块添加maven依赖:

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

3.增加配置文件(这里其实是从Demo里复制过来的,如果配置的话,只需要配置前三个即可):

public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
  // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
  public static String app_id = "";
  // 商户私钥,您的PKCS8格式RSA2私钥
    public static String merchant_private_key = "";
  // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "";
  // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
  public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
  // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
  public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
  // 签名方式
  public static String sign_type = "RSA2";
  // 字符编码格式
  public static String charset = "utf-8";
  // 支付宝网关
  public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
  // 支付宝网关
  public static String log_path = "C:\\";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    /** 
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

4.支付服务,完善支付宝支付策略者AliPayStrategy代码:

/**
 * description: 支付宝支付渠道
 * create by: YangLinWei
 * create time: 2020/5/13 4:41 下午
 */
@Slf4j
public class AliPayStrategy implements PayStrategy {
  @Override
  public String toPayHtml(PaymentChannelEntity pymentChannel, PayMentTransacDTO payMentTransacDTO) {
    log.info(">>>>>支付宝参数封装开始<<<<<<<<");
    // 获得初始化的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);
    // 商户订单号,商户网站订单系统中唯一订单号,必填
    String outTradeNo = payMentTransacDTO.getPaymentId();
    // 付款金额,必填
    String totalAmount = changeF2Y(payMentTransacDTO.getPayAmount() + "");
    // 订单名称,必填
    String subject = payMentTransacDTO.getProductName();
    // 商品描述,可空
    String body = payMentTransacDTO.getProductName()+"很不错,值得购买!";
    alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"total_amount\":\"" + totalAmount
        + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","
        + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
    // 请求
    try {
      String result = alipayClient.pageExecute(alipayRequest).getBody();
      return result;
    } catch (Exception e) {
      return null;
    }
  }
  /** 金额为分的格式 */
  public static final String CURRENCY_FEN_REGEX = "\\-?[0-9]+";
  /**
   * 将分为单位的转换为元 (除100)
   *
   * @param amount
   * @return
   * @throws Exception
   */
  public static String changeF2Y(String amount) {
    if (!amount.matches(CURRENCY_FEN_REGEX)) {
      return null;
    }
    return BigDecimal.valueOf(Long.valueOf(amount)).divide(new BigDecimal(100)).toString();
  }
}

3. 测试

首先启动项目(Eureka注册中心、单点服务中心、会员服务、支付服务、支付门户):

①浏览器模拟提交订单:http://localhost:8600/cratePayToken?payAmount=999999&orderId=20200513141452&userId=27&productName=普洱茶

2.复制token,跳转到支付详情页,浏览器输入:http://localhost:8079/pay?payToken=pay_e18fe21f43f24fbca8e9a7c3755b58fc

3.点击支付宝进行支付,会跳转到如下页面:

image.png

目录
相关文章
|
1月前
|
JavaScript 前端开发
如何在项目中集成 Babel?
如何在项目中集成 Babel?
35 3
|
4月前
|
Java Maven
2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
这篇文章是一份关于Maven的安装和配置指南,包括下载、环境变量设置、配置文件修改、IDEA集成Maven以及解决jar包下载问题的方法。
2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
|
5月前
|
安全 Java 数据安全/隐私保护
在Java项目中集成单点登录(SSO)方案
在Java项目中集成单点登录(SSO)方案
|
2月前
|
存储 JavaScript 数据库
ToB项目身份认证AD集成(一):基于目录的用户管理、LDAP和Active Directory简述
本文介绍了基于目录的用户管理及其在企业中的应用,重点解析了LDAP协议和Active Directory服务的概念、关系及差异。通过具体的账号密码认证时序图,展示了利用LDAP协议与AD域进行用户认证的过程。总结了目录服务在现代网络环境中的重要性,并预告了后续的深入文章。
|
2月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
2月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
81 0
|
2月前
|
安全 Java 测试技术
ToB项目身份认证AD集成(二):快速搞定window server 2003部署AD域服务并支持ssl
本文详细介绍了如何搭建本地AD域控测试环境,包括安装AD域服务、测试LDAP接口及配置LDAPS的过程。通过运行自签名证书生成脚本和手动部署证书,实现安全的SSL连接,适用于ToB项目的身份认证集成。文中还提供了相关系列文章链接,便于读者深入了解AD和LDAP的基础知识。
|
2月前
|
Java Shell 开发工具
git集成IDEA,托管项目实现版本管理
git集成IDEA,托管项目实现版本管理
38 0
|
2月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
232 0
|
3月前
|
存储 NoSQL 数据处理
组合和继承怎么集成一个性能较好的项目
组合与继承是面向对象编程的核心概念,前者通过对象间关联实现高效解耦,后者则重用代码以节省空间和内存。组合常用于现代项目,利用代理与依赖注入简化代码管理;而继承简化了子模块对父模块资源的应用,但修改会影响整体。随着分层解耦及微服务架构如SpringCloud的出现,这些技术进一步优化了数据处理效率和服务响应性能,尤其在分布式存储与高并发场景下。同步异步调用、Redis分布式应用等也广泛运用组合与继承,实现代码和内存空间的有效复用。