您的位置:新葡亰496net > 服务器网络 > 淘宝技术这十年,支付宝扫码支付的接口对接

淘宝技术这十年,支付宝扫码支付的接口对接

发布时间:2019-11-24 05:31编辑:服务器网络浏览(95)

    1-首先在config.xml中进行配置

    支付宝蚂蚁庄园4月19日答案是什么? apk8资讯频道编辑:Mouse2019-04-19 新葡亰496net 1

    定位

    根据支付宝的文档描述,扫码支付属于当面付的一个功能,在开通该功能前必须要创建一个应用。应用审核通过后,会得到一个PID,此时进入“管理中心-某应用-功能信息”中申请开通当面付即可。

    前段时间接到个需求,简单而言就是模仿支付宝的首页,唯一的不同就是支付宝首页的主功能模块在屏幕上方,而需求中的主功能模块在屏幕下方。

    1、任何网站或者说平台的发展都不是一蹴而就的,通常是在什么阶段采用什么技术。在发展的过程中,平台会遇到各种各样的问题,正是这些原因才推动着技术的进步和发展,而技术的发展反过来又会促进业务的更大提升。二者互为因果,相互促进。淘宝网的系统也是从使用一台服务器,到采用万台以上的服务器。

    2-在自己的应用中添加支付宝支付的模块

    剑侠:衍歌行

    签名

    接口通信过程中要对数据进行签名和验签。支付宝提供了密钥生成器,需要将生成的应用公钥填写到应用环境中。在填写应用公钥后,还可以对签名算法进行验证。支付宝的描述如下:

    请将Json串{"a":"123"}使用填写公钥对应的私钥签名,并将签名sign值输入下方文本框,支付宝将校验公钥正确性。如不会签名,可下载使用签名工具。

    这里我使用node.js的crypto模块签名,先把JSON转为字符串'{"a":"123"}',却总是得到公私钥不匹配的结果。不得已下载了支付宝提供的签名工具,在这款“支付宝报文签名生成器”的软件左下角,发现这样一行字:

    默认SHA1签名,编码:GBK,预签名串:a=123

    看来是支付宝埋的坑,于是改为对“a=123”签名,终于匹配了,下面是签名的示例代码:

    let crypto = require('crypto');
    let fs = require('fs');
    
    let str = 'a=123';
    console.log(str);
    
    let private_key = fs.readFileSync('rsa_private_key.pem');
    let signer = crypto.createSign('RSA-SHA1');
    signer.update(str);
    
    let sign = signer.sign(private_key, 'base64');
    console.log(sign);
    

    页面分析

    新葡亰496net 2

    支付宝首页

    2、好的架构是进化来的,不是设计来的,而且好的功能也是进化来的,不是设计来的,例如“支付宝”,支付宝最初是淘宝上的“安全交易”的功能,这个功能后来独立出来,成立了一个网站,也成立了一个公司,就是现在的支付宝。支付宝的迁移,是Sun公司的工程师来做的。

    3.使用支付宝模块进行拉起支付宝

    游戏版本: 6.0.1 游戏大小: 282.9 MB

    请求参数

    确定私钥和签名算法正确后,就可以尝试获取二维码了。文档说的比较清楚,要将sign之外参数按字母升序排列,签名后再将sign加入到参数中。这里有个关键步骤,就是要对参数进行urlencode。签名与验签的文档中没有提到这一点,但如果缺少会返回“签名无效”。而在移动支付的签名机制中倒是提到了urlencode,可见支付宝的文档还是有点乱。这里分两种情况考虑:

    1. 参数中没有中文,这种情况比较简单,只对sign进行encodeuricomponent即可。
    2. 参数中有中文,这时需要对含中文的参数进行编码。

    综合考虑,其实以上两点可以一起处理,即不考虑有无中文,都对所有参数进行编码。得到sign的签名值后,对整个参数Ojbect使用querystring模块处理即可:

    const qs = require('querystring');
    let signedParams = qs.stringify(params);
    

    第一轮分析

    新葡亰496net,整个页面由三个模块组成:主功能模块、应用模块和信息模块。

    • 当页面由初始状态向上滑动时,应用模块和信息模块会同时向上滑动,而主功能模块的高度会随着滑动的距离而变化,大功能按钮逐渐消失,小功能按钮逐渐显示。
    ![](https://upload-images.jianshu.io/upload_images/1990642-58758a3a68f0d0e3.PNG)
    
    向上滑动
    
    • 当小功能按钮完全显示以后,主功能模块的高度就会固定,而信息模块和应用模块还可以继续向上滑动。
    ![](https://upload-images.jianshu.io/upload_images/1990642-4e4829459435d20d.PNG)
    
    主功能模块高度固定
    
    • 淘宝技术这十年,支付宝扫码支付的接口对接。当页面由初始状态下滑时,主功能模块和应用模块的位置都会固定不变,而信息模块则会展示刷新效果,并在刷新结束后恢复初始状态。
    • 不论是上滑还是下滑,信息模块右侧都会显示滚动条。
    ![](https://upload-images.jianshu.io/upload_images/1990642-6bc709dd685f4671.PNG)
    
    向下滑动刷新
    

    根据上述效果进行分析:

    1. 整个页面由两个UITableView控件组成:

      • 由于信息模块有下拉刷新功能并且右侧显示有滚动条,因此将信息模块视为tableView1。
      • 由于信息模块和应用模块可以一起滑动,而主功能模块仅仅是改变高度,因此信息模块和应用模块一起组成tableView2。
      • 由于主功能模块只是高度发生变化而位置并不变化,因此可以将主功能模块添加在主页面上,并且用与主功能模块一样大小的空白view充当tableView2的headerView。
    2. 初始状态下,由tableView2响应上滑事件,tableView1响应下滑事件。

    3. 一旦由tableView2响应了上滑事件,那么在恢复初始状态之前,下滑事件也会由tableView2来响应。

    根据上述分析不难看出,整个页面效果实现的关键在于控制响应滑动事件的主体。暂且不论代码的复杂程度,其实现后的效果也不尽如人意。

    3、小的架构升级只需在原有架构的基础上进行改动,而较大的改动就需要大规模替换。例如淘宝的开发语言从PHP转成Java时,请了Sun公司的工程师改造成Java架构。而且要求在迁移的过程中,不停止服务,原来系统的功能改进和bugfix也不受影响。他们的方案大致是:一个模块一个模块的渐进式替换,老的架构继续维护,新功能在新的模块开发,开发完毕后放到不同的应用集群上,另开一个域名,同时再替换老的功能,替换一个,就把老的模块上的功能关闭一个,跟老的模块共用一个数据库。

     if  { // 拉起支付宝 //开发者通过 payOrder 方法来进行支付,自己处理订单信息以及签名过程 console.log; var aliPay = api.require; aliPay.payOrder({ orderInfo: 'alipay_sdk=alipay-sdk-php-20180705&app_id=2016051201393416&biz_content=%........' }, function  { api.alert({ title: '支付结果', msg: ret.code, buttons: ['确定'] }); });
    

    游戏福利: 送V10,元宝28888,金币500W

    验证签名

    这一步注意两点:

    1. 淘宝技术这十年,支付宝扫码支付的接口对接。检查支付宝公钥是否正确
      一开始我直接用了Github某个demo中的alipay_public_key.pem文件,结果总是验签失败,最后在支持中心提问,才知道这个密钥是错误的。在管理中心中可以查看支付宝公钥,我用的pem文件如下:
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkr
    IvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsra
    prwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUr
    CmZYI/FCEa3/cNMW0QIDAQAB
    -----END PUBLIC KEY-----
    
    1. 转义正斜杠
      支付宝要求,如果字符串中包含http://的正斜杠,需要先将正斜杠做转义。比如返回数据中的"qr_code":"https://qr.alipay.com/bax04939acho3lnsxaoa4047",验签时要包含这个转义字符。javascript中使用replace即可。验签代码如下:
    let signArg = res.alipay_trade_precreate_response;
    let str = JSON.stringify(signArg).replace(///g, '\/');
    let pubkey = fs.readFileSync('alipay_public_key.pem');
    let sign = res.sign;
    let verify = crypto.createVerify('RSA-SHA1').update(str);
    let ret = verify.verify(pubkey, sign, 'base64');
    console.log(ret);
    

    第二轮分析

    在第一轮分析的基础上,参考了一些网上的资料,进行了第二轮分析:

    1. 整个页面仅由一个UITableView控件组成,其主体就是信息模块。有一个小细节:当我们在主功能模块或应用模块上触摸下滑时,信息模块同样会进行下拉刷新。
    2. 主功能模块添加在主页面上,其高度随tableView滑动距离的变化而变化。
    3. 依次在tableView.headerView上添加应用模块和刷新模块。
    4. 主功能模块和应用模块正好覆盖了tableView.headerView。
      具体布局代码如下:
    _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - tabBarHeight) style:UITableViewStylePlain] ;
    _tableView.delegate = self ;
    _tableView.dataSource = self ;
    _tableView.separatorStyle = UITableViewCellSeparatorStyleNone ;
    [self.view addSubview:_tableView] ;
    
    UIView *tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, movedHeight   fixedNormalHeight)] ;
    tableHeaderView.backgroundColor = [UIColor clearColor] ;
    _tableView.tableHeaderView = tableHeaderView ;
    
    _tableView.scrollIndicatorInsets = UIEdgeInsetsMake(movedHeight   fixedNormalHeight, 0, 0, 0) ;
    
    _refreshView = [[UIView alloc]initWithFrame:CGRectMake(0, movedHeight   fixedNormalHeight - 50, [UIScreen mainScreen].bounds.size.width , 50)] ;
    [_tableView.tableHeaderView addSubview:_refreshView] ;
    
    _movedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, movedHeight   fixedNormalHeight)] ;
    [_tableView addSubview:_movedView] ;
    
    _fixedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, fixedNormalHeight)] ;
    [self.view addSubview:_fixedView] ;
    

    代码中,_movedView就是应用模块,_fixedView就是主功能模块。

    1. 滑动时:
      • 初始状态下,若tableView上滑,应用模块也会随之上滑;若tableView下滑,应用模块则会固定不动,而原本添加在tableView.headerView上的刷新动画就会显示出来。
      • 在恢复初始状态之前,若tableView先上滑再下滑,应用模块也会随之下滑。
        具体实现代码为:
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        CGFloat tableViewOffSetY = scrollView.contentOffset.y ;
        if(tableViewOffSetY >= 0) {
            _movedView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, movedHeight   fixedNormalHeight) ;
            if(tableViewOffSetY <= (fixedNormalHeight-fixedSmallHeight)) {
                CGRect frame = _fixedView.frame ;
                CGFloat height = fixedNormalHeight - tableViewOffSetY ;
                frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, height) ;
                _fixedView.frame = frame ;   
            }
            else {
                _fixedView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, fixedSmallHeight) ;
            }
        }
        else {
            _movedView.frame = CGRectMake(0, tableViewOffSetY, [UIScreen mainScreen].bounds.size.width, movedHeight   fixedNormalHeight) ;
            _fixedView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, fixedNormalHeight) ;
            if(tableViewOffSetY<-refreshHeight-10 && [scrollView isDecelerating]) {
                [self requird] ;
                [self.tableView setContentOffset:CGPointMake(0, -refreshHeight) animated:YES] ;
            }
        }
    }
    
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
        if(!decelerate) {
            if(scrollView.contentOffset.y >= 0) {
                if(scrollView.contentOffset.y < fixedSmallHeight*0.5) {
                    [scrollView setContentOffset:CGPointMake(0, 0) animated:YES] ;
                }
                else if(scrollView.contentOffset.y < fixedSmallHeight) {
                    [scrollView setContentOffset:CGPointMake(0, fixedSmallHeight) animated:YES] ;
                }
            }
        }
    }
    
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
        if(scrollView.contentOffset.y >= 0) {
            if(scrollView.contentOffset.y < fixedSmallHeight*0.5) {
                [scrollView setContentOffset:CGPointMake(0, 0) animated:YES] ;
            }
            else if(scrollView.contentOffset.y < fixedSmallHeight) {
                [scrollView setContentOffset:CGPointMake(0, fixedSmallHeight) animated:YES] ;
            }
        }
    }
    

    代码中,下拉超过一定距离就进行更新请求,并在请求期间显示请求模块

    根据第二轮分析,整个页面的实现就会变得非常简单。

    4、 用钱能解决的问题都不是问题,花钱可以购买更好的机器和更好的服务,在某个规模下可以采用现有的商业解决方案。但当你变成业内最强之后,你的问题就会独特到没有人碰到过,这就意味着你必须自己动手解决问题。于是,淘宝网被迫开始走向了技术创新的道路。我想,这也是为什么在大公司更能够锻炼技术的原因。

    具体可以参考官网的 :

    变态手游

    代码实现

    具体的实现代码见:
    https://github.com/bbbxxxbx/-

    5、互联网系统的发展看似非常专业,其实在生活中也存在类似的系统,所谓"太阳底下无新鲜事",有事我们就需要将一些专业的东西转化成生活中我们接触过比较熟悉的东西更有利于理解。比如“集群”这个概念:大型超市前台一般有很多收银员,他们提供的都是收银的功能,无论顾客到哪一个收银员前面,都可以完成付款,我们就认为所有的收银员构成了一个“集群”,都希望顾客增加的时候只需要增加收银员就行。再比如“负载均衡”:让每个收银台排队差不多,设立小件通道、VIP通道,这些可以认为都是集群带来的负载均衡的问题,从技术层面说,实现起来自然比生活中复杂很多。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    点击下载 新葡亰496net 3立即下载

    在蚂蚁庄园中4月19号答案是什么,小编相信很多玩家都不知道这个答案,下面小编给大家带来了一篇关于小明最近在理财,可以去哪里关注财富大咖,提升自己的理财姿势呢?希望能帮到大家。

    支付宝蚂蚁庄园4月19日答案

    新葡亰496net 4

    问题:小明最近在理财,可以去哪里关注财富大咖,提升自己的理财姿势呢?

    A 支付宝-财富-内容模块

    B 朋友

    答案是A 支付宝-财富-内容模块

    小伙伴答对了吗,答对的小伙伴们快去领饲料吧!

    以上就是蚂蚁庄园4月19日庄园小课堂答案是什么_支付宝蚂蚁庄园4月19日答案的全部内容,希望大家喜欢!

    玩得不过瘾?给大家带来了【手游无限元宝服】,赶紧行动起来下载玩玩看吧!更多游戏资讯尽在APK8安卓网!

    本文由新葡亰496net发布于服务器网络,转载请注明出处:淘宝技术这十年,支付宝扫码支付的接口对接

    关键词:

上一篇:学习笔记,Linux终端命令用法精选

下一篇:没有了