分布式高级篇(十一)- 订单支付

753 阅读4分钟

支付宝支付

支付宝支付使用步骤

进入蚂蚁金服开发平台

官方地址

电脑网站支付流程介绍

下载支付宝官方demo,进行配置和测试

电脑网站支付SDK&Demo

idea运行网站支付demo配置详解

什么是公钥、私钥、加密加签、密钥等

对称加密
  • 加密和解密用的是同一把钥匙

    image-20210304092532784

非对称加密
  • RSA、Elgamal等,加密解密使用不同钥匙

    image-20210304092819608

公钥私钥
  • 公钥和私钥是一个相对概念
  • 它们的公私性是相对于生成者来说的;一对密钥生成后,保存在生成者手里的就是私钥,生成者发布出去大家用的就是公钥

支付宝支付流程

  • 支付宝商户支付流程

    image-20210304101611962

配置使用沙箱进行测试

沙箱环境指导

  • 基本配置APPID、支付宝网关等待...

  • 密钥生成工具

    生成密钥,私钥配置在代码中,公钥配置在支付宝中

    image-20210304102754188

    image-20210304102949577

内网穿透

简介

  • 内网穿透功能可以允许我们使用外网的网址来访问主机;正常的外网需要访问我们项目的流程是:

    • 1、买服务器并且有公网固定ip
    • 2、买域名映射到服务器的ip
    • 3、域名需要进行备案和审核

    image-20210304132250080

使用场景

  • 开发测试(微信、支付宝)
  • 智慧互联
  • 远程控制
  • 私有云

内网穿透的几个常用软件

  • NATAPP

  • 花生壳

  • 续断

    微信登录注册,可免费使用

    安装客户端

  • nps

整合支付

下载SDK

  • 开放平台服务端的SDK

  • 引入依赖

    <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
    <dependency>
        <groupId>com.alipay.sdk</groupId>
        <artifactId>alipay-sdk-java</artifactId>
        <version>4.11.28.ALL</version>
    </dependency>
    

支付调用(同步通知)

注意:谷歌浏览器,沙箱支付会报钓鱼风险,可更换浏览器查看效果

  • 根据官方提供的DEMO,将支付代码抽取成 AlipayTemplate,只需配置 APPID、支付宝网关、私钥、支付宝公钥等等,沙箱环境提供的测试数据

    账户:ogypcv8489@sandbox.com

    image-20210304165134596

异步通知

  • 1、可以在支付成功,跳转商户页面,获取到支付宝转来的所有请求数据,验证签名(不推荐)

  • 2、在用户支付完成之后,支付宝会根据 API 中商户传入的 notify_url,通过 POST 请求的形式将支付结果作为参数通知到商户系统

    异步结果通知说明

    image-20210305143022966

    支付宝异步回调使用的就是分布式事务解决方案中的:最大努力通知型方案

    第三方系统通讯:设置最大通知次数,达到通知次数后即不再通知,各大交易业务平台间的商户通知:多次通知、查询校对、对账文件

内网穿透联调
  • 使用续断的免费穿透

    image-20210305150036283

  • 修改配置,使请求正确转发到order订单服务

    image-20210305150010528

    • 修改nginx转发规则;order订单服务,拦截器放开/payed路径下的请求

      image-20210305151334488

    • 使用postman发送请求访问

      image-20210305151406746

      image-20210305151543630

核心流程 -- 验签(防止恶意攻击)
  • 测试通过后,修改alipayTemplate中的异步通知地址-->内网穿透后的地址

    改造payment表

    image-20210305163301570

收单
  • 1、订单在支付页,不支付,一直刷新,订单过期了才支付,订单状态改为已支付,但是库存解锁了

    • 使用支付宝自动收单功能解决,只要一段时间不支付,就不能支付
  • 2、由于延时等问题,订单解锁完成,正在解锁库存的时候,异步通知才到‘

    • 订单解锁,手动调用收单
  • 3、网络阻塞问题,订单支付成功的异步通知一直不到达

    • 查询订单列表时,ajax获取当前未支付的订单状态,查询订单状态时,在获取一下支付宝的订单状态
  • ’4、其他各种问题

    • 每天晚上闲时下载支付宝对账单,进行一一对账

    image-20210305164710011

支付演示
  • 1、 提交订单,等待一分钟不支付,消息过期,关闭订单,解锁库存

    ​ 预期结果:支付宝自动收单,交易超时无法支付

  • 2、提交订单立马支付,支付成功,异步通知

    ​ 预期结果:订单状态:已付款,库存锁定