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

本文档介绍了联想应用联运移动端订阅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。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卸载/删除 Maxask.com,最简单的方法

被绑架的浏览器&#xff0c;太恶心了。 Maxask伪装成了插件&#xff0c;在你搜索网页的时候利用了重定向&#xff0c;导致出现的界面时Maxask的界面&#xff0c;很恶心。 只需要排查正在使用的&#xff0c;如下图有颜色的图表。 删除一个插件&#xff0c;浏览器搜索一下看看有…

2024年上半年软件设计师试题及答案(回忆版)--选择题

基础知识选择题 基础知识选择题 1,2,3][4,5,6][1,2,3,4,5,6] &#xff08;总&#xff1a;1分&#xff09; &#xff08;注意&#xff1a;括号内的是截止当前题目总分&#xff09; vlan不能隔绝内外网 &#xff08;2分&#xff09; 链路层使用交换机&#xff0c;…

C语言 | Leetcode C语言题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; int numDistinct(char* s, char* t) {int m strlen(s), n strlen(t);if (m < n) {return 0;}unsigned long long dp[m 1][n 1];memset(dp, 0, sizeof(dp));for (int i 0; i < m; i) {dp[i][n] 1;}for (int i m - 1; i > 0;…

M2m中的采样

采样的完整代码 import torch import numpy as np from torchvision import datasets, transforms from torch.utils.data import DataLoader, WeightedRandomSampler, SubsetRandomSamplerdef get_oversampled_data(dataset, num_sample_per_class):""" Gener…

Brewer Science将在CS Mantech进行展示

在风景如画的亚利桑那州图森市举办的CS Mantech盛会上&#xff08;2024年5月20日至23日&#xff09;&#xff0c;杰出化合物半导体材料企业Brewer Science&#xff0c;将带来一场名为“化合物半导体制造的创新材料解决方案”的演讲盛宴。这一演讲&#xff0c;定于五月二十一日星…

宝塔:如何在宝塔面板做301重定向

如何在宝塔面板做301重定向?301重定向对于网站来说非常重要。如果你的网站以www开头&#xff0c;我们应该把没有www的域名重定向到有www的域名&#xff0c;反之亦然。 1、我们进入宝塔管理后台 2、登录面板并单击添加站点。既然要把xxx.com 301发到www.xxx.com&#xff0c;我…

【设计模式深度剖析】【5】【结构型】【桥接模式】| 以电视和遥控器为例加深理解

&#x1f448;️上一篇:组合模式 设计模式-专栏&#x1f448;️ 目 录 桥接模式(Bridge Pattern)定义英文原话是&#xff1a;直译理解 4个角色UML类图代码示例 应用优点缺点使用场景 示例解析&#xff1a;电视和遥控器UML类图 桥接模式(Bridge Pattern) 定义 英文原话是&am…

最新!!2024年上半年软考【中级】网络工程师 综合知识真题解析

2024上半年软考考试已经结束了&#xff0c;为大家整理了网友回忆版的网络工程师真题及答案&#xff0c;总共41道题。 上半年考试的宝子们可以对答案预估分数&#xff01;准备下半年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&#xff01…

基于ssm+vue图书管理系统

基于ssmvue图书管理系统 ssm477图书管理系统 相关技术 javassmmysqlvueelementui

上海亚商投顾:沪指震荡反弹 半导体产业链午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡反弹&#xff0c;尾盘涨幅扩大至1%&#xff0c;深成指、创业板指同步上行&#xff0c;科创50指数…

搭载昇腾310NPU的Orange Pi AIpro开箱体验以及深度学习样例测试

Orange Pi AIpro开箱体验以及样例测试 随着人工智能和物联网技术的快速发展&#xff0c;单板计算机&#xff08;Single Board Computer, SBC&#xff09;在创客和开发者社区中越来越受到欢迎。我最近入手了一款高性能的单板计算机——Orange Pi AIpro。 在入手此款AI开发板之…

【三维重建】ePnP

PnP问题应用与一下场景&#xff1a; 已知三维点和对应二维点以及相机相机内参数&#xff0c;可以获取相机外参。 我们介绍其中的一种算法&#xff1a;ePnP 算法流程 1、ePnP算法首先在世界坐标系内寻找4个控制点&#xff0c;记作 C 1 w , C 2 w , C 3 w , C 4 w C_1^w,C_2^w,…

Laravel和ThinkPHP框架比较

一、开发体验与易用性比较 1. 代码可读性&#xff1a; - Laravel以其优雅的语法和良好的代码结构著称&#xff0c;使得代码更加易读易懂。 - 相比之下&#xff0c;ThinkPHP的代码可读性较为一般&#xff0c;在一些复杂业务场景下&#xff0c;可能会稍显混乱。 让您能够一站式…

每天写两道(一):无重复字符的最长子串、反转链表

3. 无重复字符的最长子串 3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。(1)滑动窗口 双…

Web安全:文件上传漏洞详解,文件上传漏洞原理、绕过方式和防御方案。

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

搭建服务器的主流中间件有哪些?如何在外网访问内网的服务?

计算机业内人士对于搭建服务器的中间件并不陌生&#xff0c;apache、tomcat、IIS、nginx 都是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的。今天就说说这些中间件之间有哪些区别&#xff0c;以及如何利用快解析实现内网主机应用让外网访问。 首先说…

c++ 将指针转换为 void* 后,转换为怎么判断原指针类型?

当将指针转换为void后&#xff0c;擦除了指针所指向对象的类型信息&#xff0c;因此无法通过void指针来判断原始指针的类型。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个…

【状态机动态规划】3129. 找出所有稳定的二进制数组 I

本文涉及知识点 动态规划汇总 LeetCode 3129. 找出所有稳定的二进制数组 I 给你 3 个正整数 zero &#xff0c;one 和 limit 。 一个 二进制数组 arr 如果满足以下条件&#xff0c;那么我们称它是 稳定的 &#xff1a; 0 在 arr 中出现次数 恰好 为 zero 。 1 在 arr 中出现…

OpenWrt 23.05 安装之后默认空间小 磁盘扩容 教程 软路由实测 系列六

1 安装fdisk opkg update opkg install fdisk #查看磁盘 rootOpenWrt:~# fdisk -l GPT PMBR size mismatch (246303 ! 250069679) will be corrected by write. The backup GPT table is not on the end of the device. Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 25006…

【leetcode 141】环形链表——快慢指针(龟兔赛跑)

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…