整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

APP的支付宝支付流程

APP的支付宝支付流程

近在做应用商城涉及到小程序微信支付和app支付宝支付,所以也大概地将这方面的东西看了一个遍,整个流程梳理总结一下。

环境是:tp5 + 小程序 + App

app_id 商户appid

private_path 商户私钥

1.生成密钥并上传

https://opendocs.alipay.com/open/291/105971



2.PHP的demo下载地址

https://opendocs.alipay.com/open/54/103419


3.php支付消息


<?php
/*
*	out_trade_no string 支付单号	
*	total_fee  string 支付金额(单位分)
* notify_url 支付后回调地址
*	Date:2021-03-12
*/
//微信支付
function parampay($out_trade_no,$total_fee,$notify_url){     
    
    $body='商品支付';//支付标题
    header("Content-type:text/html;charset=utf-8");            
    require_once './alipay/aop/AopClient.php';
    $private_path="./alipay/key/app_private_key.pem";//私钥路径
    //构造业务请求参数的集合(订单信息)
    $content=array();
    $content['timeout_express']="30m";
    $content['product_code']="QUICK_MSECURITY_PAY";//销售产品码,固定值
    $content['total_amount']=$total_fee;
    $content['subject']=$body;
    $content['out_trade_no']=$out_trade_no;
    $con=json_encode($content);//$content是biz_content的值,将之转化成json字符串            
    //公共参数
    $Client=new \AopClient();//实例化支付宝sdk里面的AopClient类,下单时需要的操作,都在这个类里面
    $param['app_id']='';//商户信息
    $param['method']='alipay.trade.app.pay';//接口名称,固定值
    $param['format']='json';//请求使用的编码格式
    $param['charset']='utf-8';//请求使用的编码格式
    $param['sign_type']='RSA2';//商户生成签名字符串所使用的签名算法类型
    $param['timestamp']=date("Y-m-d H:i:s");//发送请求的时间
    $param['version']='1.0';//调用的接口版本,固定为:1.0
    $param['notify_url']=SITE_URL.'/api/Onilnestudy/alipaynotify';
    $param['biz_content']=$con;//业务请求参数的集合,长度不限,json格式,即前面一步得到的
    // dump($param);
    $paramStr=$Client->getSignContent($param);//组装请求签名参数
    // $paramStr='a=123';
    $sign=$Client->alonersaSign($paramStr, $private_path, 'RSA2', true);//生成签名
    // dump($sign);
    $param['sign']=$sign;
    return $info=$Client->getSignContentUrlencode($param);//最终请求参数  
}
?>

异步回调消息处理

indows 11 KB5011563 终于开始向公司测试渠道以外的用户推出。此版本带有一些新功能和一些小的改进。您可以通过 Windows 更新尝试新的可选补丁或下载 KB5011563 的离线安装程序。

Windows 11 KB5011563 是一个可选更新,除非您明确单击“获取更新”按钮,否则它不会自动安装。正如我们所知,可以跳过可选更新并且我们不必安装它,除非我们真的需要那些小的改进和错误修复。2022 年 4 月的星期二补丁将推出相同的一组更改。

与上个月的更新不同,2022 年 3 月的可选更新并没有带来大量新功能,但几乎没有质量改进。例如,Windows 11 通知中心现在可以同时显示多达三个高优先级 Toast 通知。

适用于 Windows 11 KB5011563 的下载链接

如前所述,您可以直接从 Windows 更新设置页面下载和安装可选更新。同时,可以从 Microsoft 更新目录下载离线安装程序(.msu 包)并执行更新,而无需依赖内置机制。

如果您无法使用 Windows 更新安装更新,更新目录特别有用。在这种情况下,您可以从微软的网站上获取离线包。要开始,请打开上面的链接,选择“下载”按钮,复制 .msu 链接并在新选项卡中打开它以开始下载。

Windows 11 KB5011563(内部版本 22000.593)改进

  1. 同时显示最多三个高优先级 Toast 通知。
  2. 修复了重命名 OneDrive 文件并按 Enter 键可能会失去焦点的问题。
  3. Microsoft 已修复 SystemSettings.exe 和 Searchindexer.exe 的问题。

正如开头所说,微软正在对通知中心的默认行为进行更改。更新后,Windows 11 将同时显示三个高优先级 Toast 通知。这适用于性质相同(优先级)的呼叫、提醒或警报等通知。

因此,您可能会注意到最多四个 toast 通知,您会发现三个高优先级通知和一个普通优先级通知。

除了这个新功能,微软还修复了操作系统中的几个错误。例如,修复了一个错误,即 Windows 会错误地禁用对使用通用 Windows 平台 (UWP) 构建的应用程序的启动应用程序支持。

另一个严重错误已修复,其中 SystemSettings.exe 可能会停止工作,并且 searchindexer.exe 会阻止 Outlook 的脱机搜索返回最近的电子邮件。

微软表示,它还修复了一个潜在的性能问题,即启动时间会因网络 API 中的 UI 线程而增加,当 5G WWAN 设备唤醒缓慢时,网络会停止响应。

Build 22000.593 改进和修复:

  • 修复了 wmipicmp.dll 中的内存泄漏。
  • 解决了执行策略设置问题。
  • 解决了 Edge 等 Web 浏览器无法正确呈现由 gpresult/h 生成的 HTML 的问题。
  • 解决了 AppLocker 的 PowerShell 测试无法使用“拒绝访问”错误的问题。
  • 解决了 Kerberos.dll 可能在本地安全机构子系统服务 (LSASS) 中停止工作的问题。
  • 在 Azure Active Directory(AAD) Web 帐户管理器 (WAM) 中添加了对 Microsoft 帐户 (MSA) 直通的支持。
  • Microsoft 已修复用户帐户控制 (UAC) 对话框无法正确显示请求提升权限的应用程序的问题。
  • Microsoft 已修复 Microsoft OneDrive 文件在重命名并按 Enter 键时可能失去焦点的问题。

桌面水印

在 Windows 11 Build 22000.593 中,微软正式在未能满足操作系统官方系统要求的桌面上启用桌面水印。

您可能还记得,Windows 11 官方仅通过 TPM 2.0 和 SecureBoot 支持较新的处理器。为了提醒用户他们的硬件不受支持,微软现在在系统托盘上方放置一个水印(桌面右下角,在激活错误下方)。

此水印之前在预览版本中被发现,现在已通过今天的可选更新进入生产渠道。

任何在不受官方支持的机器上安装了 Windows 11 操作系统的人都会在桌面上看到水印,上面写着“未满足系统要求”,然后有一个链接可以了解更多信息。

.1 分析

秒杀活动中,热卖商品的详情页访问频率非常高,详情页的数据加载,我们可以采用直接从数据库查询加载,但这种方式会给数据库带来极大的压力,甚至崩溃,这种方式我们并不推荐。

? 商品详情页主要有商品介绍、商品标题、商品图片、商品价格、商品数量等,大部分数据几乎不变,可能只有数量会变,因此我们可以考虑把商品详情页做成静态页,每次访问只需要加载库存数量,这样就可以大大降低数据库的压力。

? 我们这里将采用freemarker来实现商品详情页的静态化,关于freemarker的语法我们就不在这里讲解了,大家可以自行去网上查阅相关API。

4.2 工程搭建

我们创建一个静态页生成工程,用于生成商品详情页。

pom.xml

<dependencies>
    <!--依赖web-->
    <dependency>
        <groupId>com.seckill</groupId>
        <artifactId>seckill-web</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <!--api-->
    <dependency>
        <groupId>com.seckill</groupId>
        <artifactId>seckill-goods-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <!--freemarker-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
</dependencies>

bootstrap.yml

server:
  port: 18087
spring:
  application:
    name: seckill-page
  cloud:
    nacos:
      config:
        file-extension: yaml
        server-addr: nacos-server:8848
      discovery:
        #Nacos的注册地址
        server-addr: nacos-server:8848
  profiles:
    active: dev #dev 开发环境 #test测试环境 #pro生产环境
  main:
    allow-bean-definition-overriding: true
  #freemarker配置
  freemarker:
    cache: false  #关闭模板缓存,方便测试
    settings:
      template_update_delay: 0  #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
    template-loader-path: classpath:/templates
    charset: UTF-8
    check-template-location: true
    suffix: .ftl
    content-type: text/html
    expose-request-attributes: true
    expose-session-attributes: true
    request-context-attribute: request
#超时配置
ribbon:
  ReadTimeout: 300000
  ConnectTimeout: 30000

#静态页位置
htmlPath: D:/page/html

创建文件生成对象:

public class BaseProcess {

    @Autowired
    private Configuration configuration;

    /***
     * 生成静态页
     * @param dataMap
     *          dataMap.templateName: 模板名字
     *          dataMap.path: 生成文件存储路径
     *          dataMap.name: 生成的文件名字
     * @throws Exception
     */
    public void writerPage(Map<String,Object> dataMap) throws Exception {
        //获取模板名字
        String templateName=dataMap.get("templateName").toString();

        //文件生存的路径
        String path=dataMap.get("path").toString();

        //文件路径如果不存在,则创建
        File file=new File(path);
        if(!file.exists()){
            file.mkdirs();
        }

        //获取文件名字
        String fileName=dataMap.get("name").toString();

        //获取模板对象
        Template template=configuration.getTemplate(templateName);

        //模板处理,获取生成的文件字符串
        String content=FreeMarkerTemplateUtils.processTemplateIntoString(template, dataMap);

        //生成文件
        FileUtils.writeStringToFile(new File(path,fileName),content);
    }
}

BaseProcess介绍:

该类用于生成静态文件,调用writerPage方法即可实现,其中有3个变量,变量注释如下:

templateName:模板名字,例如item.ftl,模板放到templates目录下
path:生成文件的路径,例如D:/page/html
name:生成静态页文件的名字,例如:1.html

4.3 商品详情静态页生成

生成商品详情页,我们需要提供商品信息(sku),并且将商品数据存储到数据模型Map中,然后在页面渲染。

1)静态页生成

在seckill-page中创建com.seckill.page.service.SkuPageService,添加生成静态页方法,代码如下:

/***
 * 生成静态页
 */
void itemPage(Map<String,Object> dataMap) throws Exception;

在seckill-page中创建com.seckill.page.service.impl.SkuPageServiceImpl,添加生成静态页方法,代码如下:

@Service
public class SkuPageServiceImpl extends BaseProcess implements SkuPageService  {

    /***
     * 生成静态页
     */
    @Override
    public void itemPage(Map<String,Object> dataMap) throws Exception {
        dataMap.put("username","王五");

        //生成静态页
        super.writerPage(dataMap);
    }
}

在seckill-page中创建com.seckill.page.controller.SkuPageController,添加生成静态页方法,代码如下:

@RestController
@RequestMapping(value="/page")
public class SkuPageController {

    @Autowired
    private SkuPageService skuPageService;

    @Value("${htmlPath}")
    private String htmlPath;

    /****
     * 生成商品详情静态页
     */
    @PostMapping(value="/html")
    public Result html(@RequestBody Sku sku) throws Exception {
        //数据模型
        Map<String,Object> dataMap=new HashMap<String,Object>();
        dataMap.put("name",sku.getId()+".html"); //生成静态页的文件名字
        dataMap.put("path",htmlPath);            //文件路径
        dataMap.put("templateName","item.ftl"); //模板名字
        dataMap.put("sku",sku);                  //商品数据

        //生成静态页
        skuPageService.itemPage(dataMap);
        return new Result(true, StatusCode.OK,"生成成功!");
    }
}

注意:其中bootstrap.yml中添加htmlPath: D:/page/html配置。

2)Feign调用

在seckill-page-api中创建com.seckill.page.feign.SkuPageFeign实现调用,代码如下: