移动端应用订阅SDK接入攻略

news2024/11/17 13:33:24

本文档介绍了联想应用联运移动端订阅SDK接入操作指南,您可在了解文档内容后,自行接入应用联运移动端订阅SDK。

接入前准备

1请先与联想商务达成合作意向。

2.联系联想运营,提供应用和公司信息,并获取商户id、app id、key(公私钥、用于登录和支付校验)、SDK包。

以下为需提供的信息:

2.1商户名称(例:xxx公司)

2.2应用名称

2.3应用图标(建议像素:36*36,png格式)

3.登录联想开放平台,注册开发者账号。

联想开放平台地址:https://open.lenovomm.com/developer/home

隐私政策

SDK本身不会弹出任何隐私协议,隐私协议由应用内自行设计实现,并且在应用的隐私协议中附加联想应用订阅移动端SDK隐私协议。

应用接入了联想移动端订阅SDK,提供登录和支付服务,所收集信息请阅读:协议隐私

安卓端订阅SDK及接入文档下载地址:

下载地址:  联想乐云

(密码:84m8)

阅读对象说明

研发工程师、测试工程师、产品经理

接入联运服务流程

1. 联系联想运营,提供应用和公司信息,获取商户id、appid、key(公私钥、用于登录和支付校验)。

2. 接入联想联运移动端订阅SDK,SDK内包含登录、支付功能。

名词解释

名词解释说明
移动端订阅SDK指本SDK,由联想提供,用于接入联想的各种基础服务
接入方指接入该联运SDK基础服务的各种三方应用
应用私钥商户向联运云端发起请求(支付、查询、退款等API接口),进行签名;联运云端使用应用公钥验签
平台公钥联运向商户发起通知(支付通知、退款通知),进行签名;商户使用平台公钥验签

订阅SDK接入说明

配置说明

1.aar接入

(1) AndroidStudio项目需要把aar包放入libs下,在项目gradle里添加aar;

(2) 需要把sdkDemo里app下assets目录supplierconfig.json添加到项目中;

(3) 混淆配置参考sdkDemo里proguard-rules.pro文件。

2.jar接入

配置项目AndroidManifest内容

添加以下必要权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

需要配置以下内容:

    <activity
        android:name="com.lenovo.intermodal.ui.PayActionActivity"
        android:configChanges="keyboardHidden|orientation|screenSize|navigation|locale| layoutDirection"
        android:exported="false"
        android:launchMode="singleTask"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="com.alipay.sdk.app.H5PayActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:screenOrientation="behind" >
    </activity>
    <activity
        android:name="com.alipay.sdk.app.H5AuthActivity"
        android:configChanges="orientation|keyboardHidden|navigation"
        android:exported="false"
        android:screenOrientation="behind"
        tools:ignore="MissingClass">
</activity>

初始化接口

注意:每次打开应用后,都需要调用初始化接口,才可调用联想账号登录接口或者支付接口。

接口:

void doInit(Activity context, String appId, String mchId, String privateKey, InitCallback initCallback)

InitCallback定义如下:

interface InitCallback {

void onSuccess(); //初始化成功

void onError(int errorCode, String errorMsg); //初始化失败

}

示例代码:

IntermodalClient.doInit(MainActivity.this, appId, mchId, privateKey,
            new IntermodalClient.InitCallback() {
    @Override
    public void onSuccess() {
    }

    @Override
    public void onError(int errorCode, String errorMsg) {
    }
});

联想账号接入说明

登录介绍说明

联想账号登录接口

接口定义:应用需要使用联想账号登录时调用此接口登录。

void Login(Activity context, LoginCallback callback);

示例代码:

IntermodalClient.Login(MainActivity.this, new IntermodalClient.LoginCallback() {
    @Override
    public void onFinished(boolean ret, String data) {
        if(ret){
            Toast.makeText(MainActivity.this, "login success data:"+data, Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(MainActivity.this, "login error data:"+data, Toast.LENGTH_LONG).show();
        }
    }
});

联想账号登出接口

接口定义:应用内需给出退出登录的能力,调用此接口实现。

void Logout(Activity context, LogoutCallback callback);

示例代码:

IntermodalClient.Logout(MainActivity.this, new IntermodalClient.LogoutCallback() {
    @Override
    public void onFinished(boolean ret, String data) {
        if(ret){
            Toast.makeText(MainActivity.this, "logout success data:"+data, Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(MainActivity.this, "logout error data:"+data, Toast.LENGTH_LONG).show();
 }
    }
});

支付接入说明

支付介绍说明

支付接入介绍:

(1) 移动端订阅SDK提供联想通用收银台,收银台内支付方式包括微信支付、支付宝支付、聚合码支付;

(2) 支付类型包括普通支付、代扣支付,支付类型可由cp根据业务需要选择性接入。

支付接口

接口定义:

void doPay(Activity context, final PayRequest request, final IPayResultCallback callback);

支付请求定义

联想账号支付请求

(1) 普通支付请求:PayRequest

请求示例代码:

private void payMbLogin(){
    PayRequest payRequest = new PayRequest();
    payRequest.mchNo(System.currentTimeMillis()+"");
    payRequest.attach(attach);
    payRequest.goodsDesc(goodsDec);
    payRequest.goodsName(goodsName);
    payRequest.goodsCode(goodsCode);
    payRequest.payAmount(payFee);
    payRequest.payNotify(notifyUrl);
    IntermodalClient.doPay(MainActivity.this, payRequest,
            new IPayResultCallback() {
        @Override
        public void onPayResult(int requestCode, String signvalue, String resultInfo) {
            Log.d(TAG, "onPayResult requestCode:"+requestCode+", signvalue:"+signvalue+" resultInfo:"+resultInfo);
        }
 
 });
}

(2) 代扣支付请求:PayDKRequest

请求示例代码:

private void payDkLogin(){
        PayDKRequest payRequest = new PayDKRequest();
        payRequest.mchNo(System.currentTimeMillis()+"");
        payRequest.attach(attach);
        payRequest.goodsDesc(goodsDec);
        payRequest.goodsName(goodsName);
        payRequest.goodsCode(goodsCode);
        payRequest.payAmount(payFee);
        payRequest.payNotify(notifyUrl);
        payRequest.deductionFee(deductionFee);
        payRequest.deductionPeriod(deductionPeriod);
        payRequest.firstDeductionDate(firstDeductionDate);
        payRequest.contractUrl(contractNotify);
        payRequest.productId(productId);
        IntermodalClient.doPay(MainActivity.this, payRequest,
                new IPayResultCallback() {
                    @Override
                    public void onPayResult(int requestCode, String signvalue, String resultInfo) {
                        Log.d(TAG, "onPayResult requestCode:"+requestCode+", signvalue:"+signvalue+" resultInfo:"+resultInfo);
                    }

                });
    }

支付结果返回

注:最终用户权益的变更以服务端支付通知的结果为准。

interface IPayResultCallback {
 public void onPayResult(int requestCode, String msg, String resultInfo);
}

服务端接口说明

支付通知

当用户支付完成后,联运云端将数据post到支付通知地址。商户返回SUCCESS则表示该订单支付通知,商户成功接收。商户返回其它任何字符都代表接收失败。

接收失败后联运云端会再次发送通知。通知触达10次,到达通知次数后,不会触发通知。

Post数据

字段名变量名必填类型示例值描述
商户IDmchIdYLong78993434342
应用IDappIdYLong343453453445
签名signYString参考签名算法
签名方式signTypeYStringRSA2固定值RSA2
版本versionYString1.0固定值1.0
编码charSetYStringutf-8固定值utf-8
随机字符nonceYStringdsafsadfasdfasa随机字符串
商户订单号mchNoYString
交易订单号tradeNoYLong9860494571601920交易订单号
银行流水号serialsNoYString2019090239230923第三方支付渠道的交易流水号
支付金额payFeeYInt1支付金额单位(分)
支付状态payStatusYString支付状态 1 已支付支付状态 1 已支付
支付时间payTimeYString2022-03-23 19:17:56yyyy-MM-dd HH:mm:ss
附加数据attachNStringDfasas商户私有数据

商户需返回参数

SUCCESS

通知示例代码:

{
    "mchNo": "*********1111", 
    "tradeNo": 969549918857856, 
    "serialsNo": "***********2222", 
    "payFee": 3000, 
    "payTime": "2022-10-19 17:23:12", 
    "payStatus": "1", 
    "appId": 12312312, 
    "mchId": 123123123, 
    "sign": "T2IuyxblOnKstHf7EuJZWGBroSUzwN4n6l6yZ1zahsvGfBDn2AxAhifpPUblbMuq2XHsh9Mvg==", 
    "signType": "RSA2", 
    "version": "1.0", 
    "charSet": "UTF-8", 
    "nonce": "m1wo53f6iy"
}

查询支付结果接口

请求方式:POST

请求头参数说明:Content-Type: application/json

请求Body参数说明:

1.基础参数

字段名变量名必填类型示例值描述
商户IDmchIdYLong96291345分配的商户号
应用IDappIdYLong11962913商户号下创建的APPID
随机字符串nonceYString5K8264ILTKCH16C随机字符串,不长于32位
时间戳timestampYString1648878162182时间戳(从1970-01-01T00:00:00Z开始的毫秒数)
版本versionYString1.0版本号 固定值1.0
签名signYString参考签名算法
签名方式signTypeYStringRSA2签名方式RSA2

2. 业务参数说明

字段名变量名必填类型示例值描述
交易订单号tradeNoYLong524498630711936

返回参数说明:

字段名变量名必填类型示例值
返回码codeYString10000
返回消息msgYStringSUCCESS
返回数据体dataNString

示例:

请求参数:

{
 "mchId": 233799539766016,
 "appId": 233799539766016,
 "sign": "ngAcXTBZnuuI944ae8pyMY60CpiRILjTm2uX***SEwHG19+aWotz",
 "signType": "RSA2",
 "timestamp": "1666593772589",
 "nonce": "w190bfrrog1666593772585",
 "version": "1.0",
 "tradeNo": 977319841453440,
}

返回参数:

http状态200

{
 "code": 10000,
 "message": "Success",
 "data": {
 "tradeNo": 877319841453440,
 "serialsNo": "4200001493202206141879749159",
 "payStatus": 1,
 "payTime": "2022-06-14 11:17:48",
 "payAmount": 1
 }
}

data 数据说明:

变量名必填类型描述
tradeNoYlong交易订单号
serialsNoNString交易流水号
payStatusYByte支付状态:待支付:0,已支付:1
payTimeNString支付时间 yyyy-MM-dd HH:mm:ss
payAmountYBigDecimal支付金额单位分

错误返回数据:

http状态码:非200

{"code":401,"message":"unauthorizedException","data":null}
{"code":500,"message":"error","data":null}

周期扣款—协议通知

用户签约、解约后,联运云端将数据post到协议通知地址。商户返回SUCCESS则表示该协议通知,商户成功接收。商户返回其它任何字符都代表接收失败。

接收失败后联运云端会再次发送通知。通知触达10次,到达通知次数后,不会触发通知。

Post数据

字段名变量名必填类型示例值描述
商户IDmchIdYLong78993434342
应用IDappIdYLong343453453445
签名signYString参考签名算法
签名方式signTypeYStringRSA2固定值RSA2
版本versionYString1.0固定值1.0
编码charSetYStringutf-8固定值utf-8
随机字符nonceYStringdsafsadfasdfasa随机字符串
商户订单号mchNoYString
交易订单号tradeNoYLong9860494571601920交易号
协议状态statusYString状态 1 已完成 2 已解约
变更时间changeTimeYString2022-03-23 19:17:56yyyy-MM-dd HH:mm:ss

返回参数说明:

SUCCESS

通知示例代码:

{
 "mchNo": "4fcf9d5e-4891-4e",
 "tradeNo": 1066044865591424,
 "status": "2",
 "changeTime": "2023-03-02 10:48:56",
 "appId": 233799539766016,
 "mchId": 233799539766016,
 "sign": "GP*********=",
 "signType": "RSA2",
 "version": "1.0",
 "charSet": "UTF-8",
 "nonce": "ft2u016vvo"
}

其他说明

商户订单号

商户支付的订单号由商户自定义生成,仅支持使用字母、数字、中划线-、下划线_、竖线|、星号*这些英文半角字符的组合,请勿使用汉字或全角等特殊字符。联运服务平台要求商户订单号保持唯一性,同一个应用ID不可重复(建议根据当前系统时间加随机序列来生成订单号)。重新发起一笔支付要使用新订单号,避免重复支付。

金额

交易金额默认为人民币交易,接口中参数支付金额单位为【分】,支付金额必须大于 0,参数值不能带小数,暂不支持外币交易。

日期时间

标准北京时间,时区为东八区;如果商户的系统时间为非标准北京时间。按照各个接口需要日期时间格式的传入。

签名算法

开发者需要自行实现签名,签名过程如下:

1. 筛选并排序

获取所有请求参数,不包括字节类型参数,如文件,字节流,剔除 sign 字段,剔除值为空

的参数,并按照第一个字符的键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符

则按照第二个字符的键值 ASCII 码递增排序,以此类推。

2. 拼接

将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接

起来,此时生成的字符串为待签名字符串。

例如:appId=2018071360678029&sign_type=RSA2&version=1.0

3. 签名

使用各自语言对应的 SHA256WithRSA(对应 signType 为 RSA2)签名函数利用开发者私钥(

名词解释)对待签名字符串进行签名。

4.把生成的签名赋值给 sign 参数,拼接到请求参数中.

5.验签工具:https://cloud-rest.lenovomm.com/front-sign/

版本更新日志

V2.3.0内容变更

变更项接入说明
1、新增移动端订阅SDK有接入移动端订阅SDK需求的应用可接入;
2、PC端订阅SDK更新,修复了登录部分bug有用户频繁反馈登录问题的应用可集成v2.3.0版本的PC端订阅SDK。

常见问题

1.接入订阅 SDK

Q:帐号登录窗口是SDK 弹的吗?

A:是的,SDK 弹出的登录窗口包含了登录、注册、更改密码等功能。

Q:接入联运服务后,开发者的微信、付宝支付是否需要屏蔽,改为联运服务的支付?

A:是的。

Q:是否有接口查询支付结果?

A:支付结果可通过接入文档中的“查询支付结果接口”查询。

Q:用户在收银台支付页面支付成功后,客户端如何知道用户的支付状态?

A:在收银台页面会一直轮询用户的支付状态,支付成功后刷新页面并提醒用户;用户支付

成功后联想的服务端会主动通知应用的服务端,应用的客户端可以主动查询该状态。

Q:客户购买连续包月支付成功后,如何确认是否已完成连续包月签约,以及如何区分后续扣款通知。

A:可以通过接口文档中周期扣款-协议通知部分来确认是否完成包月签约。扣款成功的支付通知里,商户订单号是初次签约支付时的订单号。

Q:连续包月最短扣款周期是多久,扣款都有哪些条件限制?

A:目前最短扣款周期为1个月,扣款条件会受支付通道限制。目前支付宝限制每个用户的单笔扣款不超过 100 元,当日扣款不超过 1000 元,当月扣款不超过 30000 元。

2. 测试

Q:支付和退款是否有测试环境?

A:无测试环境,开发者可将商品设为一个较低的金额(比如 1 分钱)进行测试。

6.3. 发布应用

Q :联运版本的应用如何发布?

A:参与联运的应用首次上架及后续版本更新,开发者需将应用包发送给联想接口人,由联

想进行配置上架。

移动端应用订阅SDK下载

名称开发者版本号主要功能版本描述更新时间个人信息处理规则合规使用说明下载地址
移动端订阅SDK北京神奇工场科技有限公司V1.0.2登录、支
此版本更新内容: 1、修改了隐私文档中关于IMEI获取及个性化推送的说明; 2、删除SDK读取序列号的系统方法,取消了不必要的调用;请下载解压后使用(包括Demo演示和开发文档2023/12/28见协议隐私见联想开放平台联想乐云 (密码:84m8)

移动端应用订阅SDK合规使用说明

更新时间:2024-01-26

根据《个人信息保护法》、《数据安全法》、《网络安全法》等法律法规和监管部门规章要求,App开发运营者(以下简称为“开发者”)在提供网络产品服务时应尊重和保护最终用户的个人信息,不得违法违规收集使用个人信息,保证和承诺就个人信息处理行为获得最终用户的授权同意,遵循最小必要原则,且应当采取有效的技术措施和组织措施确保个人信息安全。为帮助开发者在使用移动端应用订阅SDK的过程中更好地落实用户个人信息保护相关要求,避免出现侵害最终用户个人信息权益的情形,特制定本合规使用说明,供开发者在接入使用移动端应用订阅SDK服务时参照自查和合理配置,不断提升个人信息保护水平。

移动端应用订阅SDK配置能力说明

1. SDK扩展业务功能的配置说明

要求内容:《SDK合规使用说明》应详细说明SDK各项扩展业务功能介绍及对应关闭的配置方式、示例。

接入说明:应用订阅移动端SDK提供的基本业务功能是为开发者应用提供联想账号登录、以及支付的技术服务,开发者可以通过接入应用订阅移动端SDK在其应用内为最终用户提供登录、支付的功能或服务。目前不涉及提供其他扩展业务功能,如后续提供其他扩展业务功能,将通过本合规使用说明向开发者详细介绍具体的扩展业务功能及其关闭配置方式和示例。

2. SDK可选个人信息的配置说明

要求内容:《SDK合规使用说明》应详细说明SDK各项可选个人信息使用目的、场景及对应关闭的配置方式、示例。

接入说明:对于应用订阅移动端SDK可选收集的个人信息的控制,开发者可以参考如下配置文档的内容进行配置操作。因相关信息的不收集将会对其对应的功能造成影响,请开发者结合业务实际需要进行合理配置。配置文档链接:

联想开放平台

应用订阅移动端SDK可选个人信息的说明:

可选个人信息类型及字段使用目的使用场景
设备信息设备唯一标识码(IMEI、OAID(针对Android Q以上版本))、Android ID、MAC地址、设备型号、制造商、系统、应用版本信息、屏幕分辨率、网络类型、运营商信息。为开发者提供联想账号登录的技术服务,保障正常的登录流程。若开发者的应用需要接入联想账号的登录功能,则在用户登录联想账号时使用。

3. SDK可按照不同频次、精度收集个人信息的配置说明

要求内容:如果SDK可按照不同频次、精度收集个人信息的,《SDK合规使用说明》应说明不同频次、精度的使用目的、场景及对应选择的配置方式、示例。

接入说明:收集频次方面,应用订阅移动端SDK的数据采集仅在App调用/最终用户触发相关功能时触发,不涉及定时逻辑等频次控制选项。收集精度方面,应用订阅移动端SDK不涉及可根据精度收集个人信息的情形。

4. SDK申请系统权限的说明

要求内容:《SDK合规使用说明》应详细说明SDK所需的系统权限与各业务功能间的关系,并说明权限申请时机。

接入说明:对于应用订阅移动端SDK可选申请的系统权限,您可以参考相关如下表格的内容,详细了解相关权限与各业务功能的关系及其申请时机,因相关权限的不申请将会对其对应的功能造成影响,您可以结合业务实际需要进行合理配置。配置文档链接:联想开放平台

权限名称调用权限的目的是否询问可否关闭权限关闭权限对相应功能的影响
允许访问网络连接网络跟随接入的三方应用询问访问无法登录支付
获取wifi网络状态连接网络跟随接入的三方应用询问访问无法登录支付
获取移动网络状态连接网络跟随接入的三方应用询问访问无法登录支付
允许使用相机权限扫一扫使用此功能前会询问无法完成扫一扫相关的功能
允许使用相机打开灯光扫一扫使用此功能前会询问扫一扫时无法打开灯光

5. SDK初始化及业务功能调用时机

要求内容:《SDK合规使用说明》应详细说明SDK初始化及各项业务功能接口合规调用时机,如最终用户选择使用第三方登录方式后,初始化某第三方登录SDK。App应当在App登录注册页面及App首次运行时,通过弹窗、文本链接及附件等简洁明显且易于访问的方式,向最终用户告知涵盖个人信息处理主体、处理目的、处理方式、处理类型、保存期限等内容的个人信息处理规则,并且获得最终用户授权同意后才能处置最终用户数据。

接入说明:应用订阅移动端SDK初始化时会获取用户的IMEI和mac地址,请务必在用户同意您App种的隐私政策之后,再进行应用订阅移动端SDK的初始化。用户同意隐私政策之前,避免动态申请涉及用户个人信息的敏感设备权限;用户同意隐私政策前,您应避免私自采集和上报个人信息。具体的初始化时机可以详细查阅相关接入文档的内容。具体配置文档链接:

联想开放平台

6. SDK隐私政策披露要求与示例

要求内容:《SDK合规使用说明》应提供App向最终用户披露SDK隐私政策条款的示例,包括SDK名称、公司名称、处理个人信息种类及目的、采集方式、隐私政策链接等内容。

接入说明: 开发者在App集成应用订阅移动端SDK后,应用订阅移动端SDK的正常运行会收集必要的最终用户信息。 请开发者根据集成应用订阅移动端SDK的实际情况,在您App的隐私政策中,对应用订阅移动端SDK名称、公司名称、处理个人信息种类及目的、采集方式、隐私政策链接等内容进行披露。建议:确认您所接入的应用订阅移动端SDK版本和功能模块;根据上述版本和模块,从隐私政策中确定与应用订阅移动端SDK交互的数据内容;在您App的隐私政策中,以文字或列表的方式向公众披露应用订阅移动端SDK的相关信息。

披露示例(仅供参考,请以实际合作情况为准):

SDK名称:应用订阅移动端SDK

涉及个人信息:设备唯一标识码(IMEI、OAID(针对Android Q以上版本))、Android ID、MAC地址、设备型号、制造商、系统、应用版本信息、屏幕分辨率、网络类型、运营商信息、wifi状态

合作方主体:北京神奇工场科技有限公司

使用目的:是为开发者应用提供联想账号登录、以及支付的技术服务,开发者可以通过接入应用订阅移动端SDK在其应用内为最终用户提供登录、支付的功能或服务。

使用场景:向最终用户登录联想账号或者支付时使用

收集方式:SDK自行采集

隐私政策链接:协议隐私

7. 最终用户同意方式的示例

要求内容:《SDK合规使用说明》应详细说明App获取最终用户授权同意的建议方式,其中需要取得最终用户单独同意的,应显著提示并给出示例。

接入说明:App首次运行时应当有隐私弹窗,隐私弹窗中应公示简版隐私政策内容并附完整版隐私政策链接,并明确提示最终用户阅读并选择是否同意隐私政策;隐私弹窗应提供同意按钮和拒绝同意的按钮,并由最终用户主动选择。

8. 最终用户行使权利的配置说明

要求内容:最终用户对其个人信息的处理享有知情、决定、查阅、复制、补充、更正、撤回授权同意、删除、注销账号等权利。以嵌入接口形式向最终用户提供行使权利的,应提供接口调用方式、示例。

接入说明:开发者在其App中集成应用订阅移动端SDK后,应用订阅移动端SDK的正常运行会收集必要的最终用户信息。开发者应根据相关法律法规为最终用户提供行使个人信息主体权利的路径或功能, 需要应用订阅移动端SDK配合的,请与应用订阅移动端SDK及时进行联系,我们将与开发者协同妥善解决最终用户的诉求。

原文地址https://open.lenovomm.com/developer/doc?id=1672793830201233409

联想开放平台地址:联想开放平台

联想开发者专属QQ客服(工作日9:30-18:00):联想开发平台首页右侧悬浮的在线客服聊天入口可直接会话,无需添加好友。也可搜索官方客服QQ号2881414004。

联想应用商店微信公众号:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1704793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python编程之旅:从错误到精通的奇妙探险

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、初识Python编程的陷阱与解决方案 1. 语法错误&#xff1a;防范于未然 2. 逻辑错误&…

流媒体内网穿透/组网/视频协议转换EasyNTS上云网关如何更改密码?

EasyNTS上云网关的主要作用是解决异地视频共享/组网/上云的需求&#xff0c;网页对域名进行添加映射时&#xff0c;添加成功后会生成一个外网访问地址&#xff0c;在浏览器中输入外网访问地址&#xff0c;即可查看内网应用。无需开放端口&#xff0c;EasyNTS上云网关平台会向Ea…

shell脚本读写二进制文件

文章目录 shell脚本读写二进制文件读取二进制文件使用xxd命令使用od命令 写入二进制文件使用echo和printf 读取和修改二进制文件使用dd命令 组合使用工具 shell脚本读写二进制文件 在Shell脚本中处理二进制文件时&#xff0c;可以使用一些常用的命令和工具来读取和写入二进制数…

Leetcode刷题笔记5

76. 最小覆盖子串 76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a; 暴力枚举 哈希表 先定义left和right&#xff0c;可以在随机位置 枚举一个位置向后找&#xff0c;找到一个位置之后&#xff0c;发现这段区间是一个最小的区间之后&#xff0c…

C++ day1 作业练习

整理思维导图 定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置。 #include <iostream> #include <cstring>using namespace std; namespace my_space {string s1; }void show() {cout<…

ONLYOFFICE 协作空间与 WordPress 如何集成

转载自作者&#xff1a;VincentYoung&#xff0c;略有改动 阅读本文&#xff0c;了解如何将 ONLYOFFICE 协作空间与 WordPress 进行集成。 ONLYOFFICE 协作空间是其去年新推出的产品&#xff0c;用创建虚拟办公室房间的方式&#xff0c;来组织公司内部团队成员的在线协作办公&…

FBA头程空运物流的运输时效与计费方式解析

FBA头程空运物流&#xff0c;是运用专业的货机或搭载货物的客机&#xff0c;为轻小商品提供的一种直接、迅速的配送服务。它尤其适合时间紧促的物流伙伴&#xff0c;尽管相较于其他运输方式&#xff0c;空运成本可能稍高&#xff0c;但其卓越的时效性为物流伙伴带来了极高的性价…

单片机的内存映射和重映射

内存映射 在单片机内&#xff0c;不管是RAM还是ROM还是寄存器&#xff0c;他们都是真实存在的物理存储器&#xff0c;为了方便操作&#xff0c;单片机会给每一个存储单元分配地址&#xff0c;这就叫做内存映射。 单片机的内存映射是指将外部设备或外部存储器映射到单片…

linux下的openssh简介(centos 8)

目录 1. 简介2. 安装 OpenSSH3. 配置 OpenSSH 服务器3.1 服务器配置文件配置文件的详解 3.2 安全操作——修改 SSH 端口3.3 安全操作——禁止 root 登录3.4 安全操作——密钥认证3.5 安全操作——禁止密码认证 4. 配置 OpenSSH 客户端4.0 常用命令4.0.1 ssh常用命令4.0.2 scp常…

ubuntu22部署Docker私有仓库Harbor (http https方式)

harbor日志&#xff1a;/var/log/harbor 前置安装配置 需先安装docker和docker-compose&#xff1a; 0.配置清华大学apt源并安装docker #信任 Docker 的 GPG 公钥: sudo apt-get install ca-certificates curl gnupg curl -fsSL https://download.docker.com/linux/ubunt…

遥测终端机RTU:为水利细分场景量身定制的智能化应用

在日益智能化的现代社会&#xff0c;水利行业正迎来前所未有的变革。为了更好地满足水利细分场景的需求&#xff0c;我们针对每个细分场景推出了专用遥测终端机&#xff0c;为您的水利工作带来前所未有的便捷与高效。 为一款智能化应用&#xff0c;遥测终端机的安全性也是我们…

图形学初识--纹理采样和Wrap方式

文章目录 前言正文1、为什么需要纹理采样&#xff1f;2、什么是纹理采样&#xff1f;3、如何进行纹理采样&#xff1f;&#xff08;1&#xff09;假设绘制区域为矩形&#xff08;2&#xff09;假设绘制区域为三角形 4、什么是纹理的Wrap方式&#xff1f;5、有哪些纹理的Wrap方式…

强大友好的Nginx扩展:VeryNginx

VeryNginx&#xff1a; 简化Web管理&#xff0c;增强网站防御- 精选真开源&#xff0c;释放新价值。 概览 VeryNginx是一个基于lua-nginx-module&#xff08;openresty&#xff09;的高效、友好的Nginx版本&#xff0c;专为满足现代Web应用的需求而设计。它不仅提供了强大的We…

Java | Leetcode Java题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; class Solution {public int numDistinct(String s, String t) {int m s.length(), n t.length();if (m < n) {return 0;}int[][] dp new int[m 1][n 1];for (int i 0; i < m; i) {dp[i][n] 1;}for (int i m - 1; i > 0; …

K-means聚类模型入门介绍

K-means聚类是一种无监督学习方法&#xff0c;广泛应用于数据挖掘、机器学习和模式识别等领域&#xff0c;用于将数据集划分为K个簇&#xff08;cluster&#xff09;&#xff0c;其中每个簇的数据具有相似的特征。其基本思想是通过迭代寻找使簇内点间距离平方和最小的簇划分方式…

【Java SE】超详细讲解String类(上)

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 初步认识String2. String类的常用方法2.1 字符串构造2.2 String对象比较2.2.1 比较是否引用同一个对象2.2…

创新实训2024.05.28日志:记忆化机制、基于MTPE与CoT技术的混合LLM对话机制

1. 带有记忆的会话 1.1. 查询会话历史记录 在利用大模型自身能力进行对话与解答时&#xff0c;最好对用户当前会话的历史记录进行还原&#xff0c;大模型能够更好地联系上下文进行解答。 在langchain chat chat的chat函数中&#xff0c;通过实现langchain框架提供的ChatMemo…

XGIS引擎上线曲折历史

演示地址&#xff1a;threelab首页 其实在一年前甚至更早&#xff0c;已经完整了初版的XGIS三维引擎开发&#xff0c;完成了基本的操作。 但是很多原因导致我一直没有上线&#xff0c;也不是没有上线&#xff0c;上线了&#xff0c;又下掉了。总感觉自己写的欠缺&#xff0c;或…

Easy-laser激光对中仪维修D505激光测平仪维修

Easylaser激光对中仪多应用于风力发电业的塔架、机架、轮毂、偏航轴承和变桨轴承的几何指标测量中。此系列常见维修型号包括D450&#xff1b;D480&#xff1b;D505&#xff1b;D525&#xff1b;D550等。 Easy-Laser对中仪维修注意事项&#xff1a; 测量功能包括&#xff1a; …

虚拟化技术 分布式资源调度

一、实验内容 实现分布式资源调度 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置已安装VMware Workstation Pro已安装Windows Server 2008 R2 x64已安装vCenter Server 三、实验步骤 将主机esxi1和esxi2加入…