HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

增加取消云打包排队的按钮

Linux HBuilderX CLI hbx

增加取消云打包排队的按钮,以及增加取消云打包排队的cli命令

增加取消云打包排队的按钮,以及增加取消云打包排队的cli命令

PC端微信小程序,切换tabBar卡死问题

微信小程序

初始排查方向:

  1. 微信API兼容性问题
  2. 组件兼容性问题
  3. 数据更新机制问题

排查过程:
在初步测试中,我们发现该小程序仅能在体验版环境下通过电脑端进行查看,而开发版本则无法正常打开,或使用自动预览功能,点击 预览->自动预览,可以选择启动 PC 自动预览,点击编译并预览,成功的话将在微信 PC 版上自动拉起小程序。
进一步的诊断显示,即使移除了微信API相关的更新代码,应用仍然出现卡顿现象。为精确定位问题源头,我们采取了逐页注释与标签级注释的方法逐步排除,最终确认问题是由于某公共状态管理中的数据引起。
具体而言,所有使用TabBar导航模式的页面以及登录页面均频繁调用同一接口,并基于此更新上述提及的公共状态管理中的数据,导致了性能瓶颈。

解决方案:
● 在短时间内减少对特定接口的请求频率。
● 在更新公共状态管理的数据时引入一致性检查逻辑,即只有当新获取的数据与现有数据存在差异时才执行更新操作。
● 同时该公共状态管理数据appConfig嵌套过深,如需使用appConfig中某个单一数据,请在store文件中的getters声明再引用。

继续阅读 »

初始排查方向:

  1. 微信API兼容性问题
  2. 组件兼容性问题
  3. 数据更新机制问题

排查过程:
在初步测试中,我们发现该小程序仅能在体验版环境下通过电脑端进行查看,而开发版本则无法正常打开,或使用自动预览功能,点击 预览->自动预览,可以选择启动 PC 自动预览,点击编译并预览,成功的话将在微信 PC 版上自动拉起小程序。
进一步的诊断显示,即使移除了微信API相关的更新代码,应用仍然出现卡顿现象。为精确定位问题源头,我们采取了逐页注释与标签级注释的方法逐步排除,最终确认问题是由于某公共状态管理中的数据引起。
具体而言,所有使用TabBar导航模式的页面以及登录页面均频繁调用同一接口,并基于此更新上述提及的公共状态管理中的数据,导致了性能瓶颈。

解决方案:
● 在短时间内减少对特定接口的请求频率。
● 在更新公共状态管理的数据时引入一致性检查逻辑,即只有当新获取的数据与现有数据存在差异时才执行更新操作。
● 同时该公共状态管理数据appConfig嵌套过深,如需使用appConfig中某个单一数据,请在store文件中的getters声明再引用。

收起阅读 »

【解决】oppo上架应用市场提示套用马甲,相似度过高的问题

uniapp 应用上架 上架被拒 5+App开发

一、开发者困境:遭遇“代码相似度过高”上架应用商店驳回

最近,我遇到了一件非常棘手的事情。自己精心开发的一款Android APP在提交到某主流应用商店进行审核时,被无情驳回了。审核反馈的理由非常刺眼:“代码相似度过高”或“代码相似度极高”、“疑似马甲”。

二、解决办法:使用“问顶安全”的Android应用加固顺利过审

在寻求解决方案的过程中,我接触到了深圳问顶安全科技有限公司(asktopsec.com)的APP加固服务。抱着试一试的心态,我使用了他们的Android APP加固产品对APK进行了加固处理,随后重新申请上架

结果令人惊喜,再次提交审核后,应用商店顺利通过了审核,之前的“代码相似度过高”提示彻底消失。APP成功上架!

后面我咨询客服才了解到,这家公司的团队成员数十年安全经验,其独有的2大核心技术成功帮我上架成功:

1.随机生成加固特征
根据每个APP/版本 随机生成独一无二的加固特征。有效防止加固检测、自动化脱壳工具、病毒误报,为阻断特征识别场景而生。

2.APP矩阵防护
多维度、矩阵式对APP进行增强型加密或混淆,增加逆向分析难度。可以达到千人千面的防护效果。

三、总结

面对应用市场上架的严苛审核,选择专业的安全服务至关重要。如果你也面临代码相似度高、被误判定为马甲包或需要高等级的安全防护,深圳问顶安全科技有限公司是一个值得信赖的选择。他们的官网:asktopsec.com ,进去后就能看到醒目的“Android应用加固与安全检测平台”了,点进去开始加固你的App吧~

继续阅读 »

一、开发者困境:遭遇“代码相似度过高”上架应用商店驳回

最近,我遇到了一件非常棘手的事情。自己精心开发的一款Android APP在提交到某主流应用商店进行审核时,被无情驳回了。审核反馈的理由非常刺眼:“代码相似度过高”或“代码相似度极高”、“疑似马甲”。

二、解决办法:使用“问顶安全”的Android应用加固顺利过审

在寻求解决方案的过程中,我接触到了深圳问顶安全科技有限公司(asktopsec.com)的APP加固服务。抱着试一试的心态,我使用了他们的Android APP加固产品对APK进行了加固处理,随后重新申请上架

结果令人惊喜,再次提交审核后,应用商店顺利通过了审核,之前的“代码相似度过高”提示彻底消失。APP成功上架!

后面我咨询客服才了解到,这家公司的团队成员数十年安全经验,其独有的2大核心技术成功帮我上架成功:

1.随机生成加固特征
根据每个APP/版本 随机生成独一无二的加固特征。有效防止加固检测、自动化脱壳工具、病毒误报,为阻断特征识别场景而生。

2.APP矩阵防护
多维度、矩阵式对APP进行增强型加密或混淆,增加逆向分析难度。可以达到千人千面的防护效果。

三、总结

面对应用市场上架的严苛审核,选择专业的安全服务至关重要。如果你也面临代码相似度高、被误判定为马甲包或需要高等级的安全防护,深圳问顶安全科技有限公司是一个值得信赖的选择。他们的官网:asktopsec.com ,进去后就能看到醒目的“Android应用加固与安全检测平台”了,点进去开始加固你的App吧~

收起阅读 »

【开源】windows上传ipa、管理证书和描述文件,数据无需上传云端

ipa Appstore上传

Github:https://github.com/friend-nicen/appuploader

App Store Connect GUI

一款基于 WailsVue 3 开发的跨平台(macOS / Windows / Linux)App Store Connect 桌面可视化工具。
它通过直接调用 App Store Connect API 的底层机制,实现了本地化、图形化的证书、设备、Bundle ID 和配置文件的管理,提供了现代化的 SaaS Dashboard 体验。

特性

  • 现代 UI: 基于 Vue 3 + TailwindCSS 实现的流畅响应式桌面端界面。
  • 本地存储: 使用无 CGO 依赖的纯 Go SQLite 驱动 github.com/glebarez/sqlite 本地加密存储 API Keys 等配置信息。
  • 多账户管理: 支持配置多个 Issuer ID、Key ID 和 Private Key,支持无缝切换。
  • 核心功能:
    • Bundle ID 管理: 查看现有的 App IDs
    • 证书管理 (Certificates): 查看各类证书信息
    • 描述文件管理 (Profiles): 浏览 Provisioning Profiles
    • 设备管理 (Devices): 查看和管理测试设备

技术栈

  • 后端 (Go): Go 1.21+, Wails v2, GORM, golang-jwt/jwt/v5
  • 前端 (Web): Vue 3 (Composition API), Vue Router, TailwindCSS 3
  • 数据库: SQLite (github.com/glebarez/sqlite)

API 密钥申请指南

使用本工具前,需要先在 Apple App Store Connect 中创建 API 密钥。

1. 前置条件

2. 创建 API 密钥

  1. 打开 App Store Connect → 右上角 "我的账户""API 密钥"
  2. 点击 "生成 API 密钥"
  3. 勾选 "开发人员" 权限(Developer Role),这是管理证书、描述文件等所需的最低权限
  4. 立即下载 .p8 私钥文件(页面关闭后将无法再次下载,只能重新生成)

3. 获取三个关键信息

信息 位置 说明
Issuer ID (发行者 ID) API 密钥页面顶部 发行者 ID 字段 同一账户下所有密钥共享,格式为 xxxx-xxxx-xxxx-xxxx-xxxx
Key ID (密钥 ID) 密钥列表中的 密钥 ID 每个密钥唯一,格式为 XXXXXXXXXX
Private Key (私钥) 下载的 .p8 文件内容 -----BEGIN PRIVATE KEY----- 开头,-----END PRIVATE KEY----- 结尾

4. 权限说明

API 密钥支持以下角色,本工具需要 至少 开发人员 角色

角色 可用功能
开发人员 查看和管理证书、Bundle ID、设备、描述文件
管理员 上述全部 + 管理 App、用户、财务等
财务 仅查看财务报告

5. 安全注意事项

  • 私钥文件(.p8)仅下载一次,请妥善保管
  • 建议为不同环境创建不同的 API 密钥(如开发 / 生产)
  • 可在 App Store Connect 中随时 撤销 泄露的密钥
  • 本工具将私钥存储在本地 SQLite 数据库中,不会上传到任何远程服务器
  • 导出数据时导出的 JSON 文件包含完整私钥,请勿将导出的 JSON 暴露给他人

开发指南

本项目代码包含详尽的中英文注释,方便进行二次开发和功能扩展。

1. 环境准备

  • 安装 Go 1.26+
  • 安装 Node.js 18+
  • 安装 Wails CLI:
    go install github.com/wailsapp/wails/v2/cmd/wails@latest  

2. 本地开发 (Dev Mode)

开发模式下,Wails 会启动一个本地 Web 服务器,并提供热重载 (Hot Reload) 支持。

# 确保在项目根目录运行  
wails dev

前端代码位于 frontend/ 目录中,所有的 Go 暴露方法在 frontend/wailsjs/go/main/App.js 中自动生成,可以直接在 Vue 组件中以 Promise 的方式调用。

3. 编译打包 (Build)

编译生产版本时,Wails 会将前端代码打包并嵌入到最终的二进制执行文件中。

# 编译当前平台的应用  
wails build  

# 交叉编译 macOS (如果你在 Windows/Linux 上)  
wails build -platform darwin/amd64,darwin/arm64  

# 交叉编译 Windows  
wails build -platform windows/amd64

编译成功后,产物会输出到 build/bin/ 目录下。

项目结构

  • /backend: Go 后端逻辑,包含 API 客户端和 SQLite 数据库模型。
  • /frontend: Vue 3 前端代码。
    • src/views: 各大功能模块的 Vue 页面组件。
    • src/router: 页面路由配置。
  • app.go: Wails 的主生命周期文件,包含了绑定到前端的 Go 方法。
  • main.go: Wails 应用启动入口。

License

MIT License

继续阅读 »

Github:https://github.com/friend-nicen/appuploader

App Store Connect GUI

一款基于 WailsVue 3 开发的跨平台(macOS / Windows / Linux)App Store Connect 桌面可视化工具。
它通过直接调用 App Store Connect API 的底层机制,实现了本地化、图形化的证书、设备、Bundle ID 和配置文件的管理,提供了现代化的 SaaS Dashboard 体验。

特性

  • 现代 UI: 基于 Vue 3 + TailwindCSS 实现的流畅响应式桌面端界面。
  • 本地存储: 使用无 CGO 依赖的纯 Go SQLite 驱动 github.com/glebarez/sqlite 本地加密存储 API Keys 等配置信息。
  • 多账户管理: 支持配置多个 Issuer ID、Key ID 和 Private Key,支持无缝切换。
  • 核心功能:
    • Bundle ID 管理: 查看现有的 App IDs
    • 证书管理 (Certificates): 查看各类证书信息
    • 描述文件管理 (Profiles): 浏览 Provisioning Profiles
    • 设备管理 (Devices): 查看和管理测试设备

技术栈

  • 后端 (Go): Go 1.21+, Wails v2, GORM, golang-jwt/jwt/v5
  • 前端 (Web): Vue 3 (Composition API), Vue Router, TailwindCSS 3
  • 数据库: SQLite (github.com/glebarez/sqlite)

API 密钥申请指南

使用本工具前,需要先在 Apple App Store Connect 中创建 API 密钥。

1. 前置条件

2. 创建 API 密钥

  1. 打开 App Store Connect → 右上角 "我的账户""API 密钥"
  2. 点击 "生成 API 密钥"
  3. 勾选 "开发人员" 权限(Developer Role),这是管理证书、描述文件等所需的最低权限
  4. 立即下载 .p8 私钥文件(页面关闭后将无法再次下载,只能重新生成)

3. 获取三个关键信息

信息 位置 说明
Issuer ID (发行者 ID) API 密钥页面顶部 发行者 ID 字段 同一账户下所有密钥共享,格式为 xxxx-xxxx-xxxx-xxxx-xxxx
Key ID (密钥 ID) 密钥列表中的 密钥 ID 每个密钥唯一,格式为 XXXXXXXXXX
Private Key (私钥) 下载的 .p8 文件内容 -----BEGIN PRIVATE KEY----- 开头,-----END PRIVATE KEY----- 结尾

4. 权限说明

API 密钥支持以下角色,本工具需要 至少 开发人员 角色

角色 可用功能
开发人员 查看和管理证书、Bundle ID、设备、描述文件
管理员 上述全部 + 管理 App、用户、财务等
财务 仅查看财务报告

5. 安全注意事项

  • 私钥文件(.p8)仅下载一次,请妥善保管
  • 建议为不同环境创建不同的 API 密钥(如开发 / 生产)
  • 可在 App Store Connect 中随时 撤销 泄露的密钥
  • 本工具将私钥存储在本地 SQLite 数据库中,不会上传到任何远程服务器
  • 导出数据时导出的 JSON 文件包含完整私钥,请勿将导出的 JSON 暴露给他人

开发指南

本项目代码包含详尽的中英文注释,方便进行二次开发和功能扩展。

1. 环境准备

  • 安装 Go 1.26+
  • 安装 Node.js 18+
  • 安装 Wails CLI:
    go install github.com/wailsapp/wails/v2/cmd/wails@latest  

2. 本地开发 (Dev Mode)

开发模式下,Wails 会启动一个本地 Web 服务器,并提供热重载 (Hot Reload) 支持。

# 确保在项目根目录运行  
wails dev

前端代码位于 frontend/ 目录中,所有的 Go 暴露方法在 frontend/wailsjs/go/main/App.js 中自动生成,可以直接在 Vue 组件中以 Promise 的方式调用。

3. 编译打包 (Build)

编译生产版本时,Wails 会将前端代码打包并嵌入到最终的二进制执行文件中。

# 编译当前平台的应用  
wails build  

# 交叉编译 macOS (如果你在 Windows/Linux 上)  
wails build -platform darwin/amd64,darwin/arm64  

# 交叉编译 Windows  
wails build -platform windows/amd64

编译成功后,产物会输出到 build/bin/ 目录下。

项目结构

  • /backend: Go 后端逻辑,包含 API 客户端和 SQLite 数据库模型。
  • /frontend: Vue 3 前端代码。
    • src/views: 各大功能模块的 Vue 页面组件。
    • src/router: 页面路由配置。
  • app.go: Wails 的主生命周期文件,包含了绑定到前端的 Go 方法。
  • main.go: Wails 应用启动入口。

License

MIT License

收起阅读 »

我是怎么实现ios内购后恢复购买的

ApplePay 苹果内购
// 在客户端app,定义一个获取历史苹果收据的方法如下:  
function getIapOrders() {  
    return new Promise(async (resolve, reject) => {  
        try {  
            // 1. 导入 iOS 原生类  
            const NSBundle = plus.ios.importClass("NSBundle");  
            const NSData = plus.ios.importClass("NSData");  
            // 2. 获取收据 URL  
            const url = NSBundle.mainBundle().appStoreReceiptURL();  
            if (!url) {  
                uni.hideLoading();  
                uni.showToast({  
                    title: '未找到收据路径',  
                    icon: 'none'  
                });  
                reject()  
                return;  
            }  
            // 3. 读取收据数据  
            const receiptData = NSData.dataWithContentsOfURL(url);  
            if (receiptData) {  
                // 4. 【核心修改】使用 plus.ios.invoke 显式调用 base64EncodedStringWithOptions: 方法  
                // 注意:方法名后面的冒号 ":" 必须保留,代表这是一个带参数的方法  
                const base64Receipt = plus.ios.invoke(receiptData, "base64EncodedStringWithOptions:", 0);  
                if (base64Receipt) {  
                    //加密过的,它是苹果官方为你在这个 App 里发生的所有成功交易出具的“电子发票”和“资产清单”。  
                    console.log("成功获取到本地收据 Base64 数据", base64Receipt);  
                    // 5. 发送给您的服务器,解密取出数据  
                    uni.vk.callFunction({  
                        url: 'client/order/pub/verifyReceipt',  
                        data: {  
                            transaction_receipt: base64Receipt  
                        },  
                        success(res) {  
                            // 返回苹果给的交易记录  
                            resolve(res.rows)  
                        },  
                        complete(res) {  

                        }  
                    });  

                } else {                      
                    uni.hideLoading();  
                    uni.showToast({  
                        title: '收据转换 Base64 失败',  
                        icon: 'none'  
                    });  
                    reject();  
                }  
            } else {  
                uni.hideLoading();  
                uni.showToast({  
                    title: '收据内容为空,请重试',  
                    icon: 'none'  
                });  
                reject()  
            }  
        } catch (e) {  
            uni.hideLoading();  
            console.error("读取收据失败: ", e);  
            uni.showToast({  
                title: '读取凭证失败: ' + e.message,  
                icon: 'none'  
            });  
            reject()  
        }  

    })  

}
'use strict';  
const uniPay = require("uni-pay");  
module.exports = {  
    /**  
     * 加密数据,它是苹果官方为你在这个 App 里发生的所有成功交易出具的“电子发票”和“资产清单”。  
     * 通过verifyReceipt数据校验后返回json交易数据  
     * @url client/order/pub/verifyReceipt 前端调用的url参数地址  
     * data 请求参数  
     * @param {String} params1  参数1  
     */  
    main: async (event) => {  
        let { data = {}, userInfo, util, filterResponse, originalParam } = event;  
        let { customUtil, uniID, config, pubFun, vk, db, _, $ } = util;  
        let { uid } = data;  
        let res = { code: 0, msg: "" };  
        // 业务逻辑开始-----------------------------------------------------------  
        // 测式时的沙箱模式下  
        let  uniPayInstance =  uniPay.initAppleIapPayment({ provider: "appleiap", provider_pay_type: "app" ,sandbox:true});  
        let tradeRes = await uniPayInstance.verifyReceipt({  
            receiptData: data.transaction_receipt  
        });  
        // console.log("************ uniPayInstance **************",JSON.stringify(tradeRes))  
        res.rows=[];  
        if(tradeRes.tradeState == "SUCCESS"){  
            /**  
             * original_purchase_date、   original_purchase_date_ms、 original_transaction_id  
             * product_id、purchase_date、purchase_date_ms  
             * quantity  
             * transaction_id  
             */  
            res.rows = tradeRes.receipt.in_app  
        }  
        debugger  
        // 业务逻辑结束-----------------------------------------------------------  
        return res;  
    }  
}

继续阅读 »
// 在客户端app,定义一个获取历史苹果收据的方法如下:  
function getIapOrders() {  
    return new Promise(async (resolve, reject) => {  
        try {  
            // 1. 导入 iOS 原生类  
            const NSBundle = plus.ios.importClass("NSBundle");  
            const NSData = plus.ios.importClass("NSData");  
            // 2. 获取收据 URL  
            const url = NSBundle.mainBundle().appStoreReceiptURL();  
            if (!url) {  
                uni.hideLoading();  
                uni.showToast({  
                    title: '未找到收据路径',  
                    icon: 'none'  
                });  
                reject()  
                return;  
            }  
            // 3. 读取收据数据  
            const receiptData = NSData.dataWithContentsOfURL(url);  
            if (receiptData) {  
                // 4. 【核心修改】使用 plus.ios.invoke 显式调用 base64EncodedStringWithOptions: 方法  
                // 注意:方法名后面的冒号 ":" 必须保留,代表这是一个带参数的方法  
                const base64Receipt = plus.ios.invoke(receiptData, "base64EncodedStringWithOptions:", 0);  
                if (base64Receipt) {  
                    //加密过的,它是苹果官方为你在这个 App 里发生的所有成功交易出具的“电子发票”和“资产清单”。  
                    console.log("成功获取到本地收据 Base64 数据", base64Receipt);  
                    // 5. 发送给您的服务器,解密取出数据  
                    uni.vk.callFunction({  
                        url: 'client/order/pub/verifyReceipt',  
                        data: {  
                            transaction_receipt: base64Receipt  
                        },  
                        success(res) {  
                            // 返回苹果给的交易记录  
                            resolve(res.rows)  
                        },  
                        complete(res) {  

                        }  
                    });  

                } else {                      
                    uni.hideLoading();  
                    uni.showToast({  
                        title: '收据转换 Base64 失败',  
                        icon: 'none'  
                    });  
                    reject();  
                }  
            } else {  
                uni.hideLoading();  
                uni.showToast({  
                    title: '收据内容为空,请重试',  
                    icon: 'none'  
                });  
                reject()  
            }  
        } catch (e) {  
            uni.hideLoading();  
            console.error("读取收据失败: ", e);  
            uni.showToast({  
                title: '读取凭证失败: ' + e.message,  
                icon: 'none'  
            });  
            reject()  
        }  

    })  

}
'use strict';  
const uniPay = require("uni-pay");  
module.exports = {  
    /**  
     * 加密数据,它是苹果官方为你在这个 App 里发生的所有成功交易出具的“电子发票”和“资产清单”。  
     * 通过verifyReceipt数据校验后返回json交易数据  
     * @url client/order/pub/verifyReceipt 前端调用的url参数地址  
     * data 请求参数  
     * @param {String} params1  参数1  
     */  
    main: async (event) => {  
        let { data = {}, userInfo, util, filterResponse, originalParam } = event;  
        let { customUtil, uniID, config, pubFun, vk, db, _, $ } = util;  
        let { uid } = data;  
        let res = { code: 0, msg: "" };  
        // 业务逻辑开始-----------------------------------------------------------  
        // 测式时的沙箱模式下  
        let  uniPayInstance =  uniPay.initAppleIapPayment({ provider: "appleiap", provider_pay_type: "app" ,sandbox:true});  
        let tradeRes = await uniPayInstance.verifyReceipt({  
            receiptData: data.transaction_receipt  
        });  
        // console.log("************ uniPayInstance **************",JSON.stringify(tradeRes))  
        res.rows=[];  
        if(tradeRes.tradeState == "SUCCESS"){  
            /**  
             * original_purchase_date、   original_purchase_date_ms、 original_transaction_id  
             * product_id、purchase_date、purchase_date_ms  
             * quantity  
             * transaction_id  
             */  
            res.rows = tradeRes.receipt.in_app  
        }  
        debugger  
        // 业务逻辑结束-----------------------------------------------------------  
        return res;  
    }  
}

收起阅读 »

【需求反馈】关于鸿蒙平台支持页面透明背景的需求反馈

uniapp 鸿蒙next

关于 uni-app 鸿蒙平台支持透明窗口页面的需求反馈

一、当前问题

我们在多个项目中,通过 pages\.json 配置透明背景实现透明弹窗页面,该方案在 APP-PLUS(安卓 /iOS)端可正常运行,但在鸿蒙平台不支持,导致原有功能失效。

现有可用配置(APP-PLUS IOS和安卓端)

{  
    "path": "pages/dialog/copy",  
    "style": {  
        "navigationStyle": "custom",  
        // #ifdef APP-PLUS  
        "backgroundColor": "transparent",  
        "backgroundColorTop": "transparent",  
        "backgroundColorBottom": "transparent",  
        // #endif  
        "app-plus": {  
            "animationType": "fade-in",  
            "background": "transparent",  
            "popGesture": "none"  
        }  
    }  
}

鸿蒙平台存在的缺陷

  1. 不支持 pages.json 中配置 backgroundColor: transparent 实现透明窗口;

  2. 官方提供的鸿蒙专属 API uni.setBackgroundColor(OBJECT) 不支持设置透明值,无法替代原有方案;

  3. 无官方等效方案,只能将所有页面弹窗改为自定义组件,改造工作量极大。

二、业务影响

  1. 多个存量项目大量页面使用透明页面做弹窗,无法直接兼容鸿蒙端

  2. 若全部改用组件实现,需要大量修改老代码,耗时且容易产生兼容问题;

  3. 跨端一致性被破坏,APP 端正常运行、鸿蒙端无法使用。

三、需求建议

  1. 优先兼容原有配置
    鸿蒙平台支持 pages\.jsonbackgroundColor: transparent 透明配置,与 APP 端保持一致,实现零成本兼容。

  2. 新增官方透明页面 API
    参考 uni-app x 的 uni.openDialogPage(options),在 uni-app 标准版鸿蒙平台提供官方透明弹窗页面方法。

  3. 完善现有 API
    升级 uni.setBackgroundColor,支持透明色值,补全基础能力。

四、核心诉求

透明窗口是弹窗类核心功能,恳请官方尽快适配鸿蒙平台透明页面能力,保持跨端统一,大幅降低老项目改造工作量。

继续阅读 »

关于 uni-app 鸿蒙平台支持透明窗口页面的需求反馈

一、当前问题

我们在多个项目中,通过 pages\.json 配置透明背景实现透明弹窗页面,该方案在 APP-PLUS(安卓 /iOS)端可正常运行,但在鸿蒙平台不支持,导致原有功能失效。

现有可用配置(APP-PLUS IOS和安卓端)

{  
    "path": "pages/dialog/copy",  
    "style": {  
        "navigationStyle": "custom",  
        // #ifdef APP-PLUS  
        "backgroundColor": "transparent",  
        "backgroundColorTop": "transparent",  
        "backgroundColorBottom": "transparent",  
        // #endif  
        "app-plus": {  
            "animationType": "fade-in",  
            "background": "transparent",  
            "popGesture": "none"  
        }  
    }  
}

鸿蒙平台存在的缺陷

  1. 不支持 pages.json 中配置 backgroundColor: transparent 实现透明窗口;

  2. 官方提供的鸿蒙专属 API uni.setBackgroundColor(OBJECT) 不支持设置透明值,无法替代原有方案;

  3. 无官方等效方案,只能将所有页面弹窗改为自定义组件,改造工作量极大。

二、业务影响

  1. 多个存量项目大量页面使用透明页面做弹窗,无法直接兼容鸿蒙端

  2. 若全部改用组件实现,需要大量修改老代码,耗时且容易产生兼容问题;

  3. 跨端一致性被破坏,APP 端正常运行、鸿蒙端无法使用。

三、需求建议

  1. 优先兼容原有配置
    鸿蒙平台支持 pages\.jsonbackgroundColor: transparent 透明配置,与 APP 端保持一致,实现零成本兼容。

  2. 新增官方透明页面 API
    参考 uni-app x 的 uni.openDialogPage(options),在 uni-app 标准版鸿蒙平台提供官方透明弹窗页面方法。

  3. 完善现有 API
    升级 uni.setBackgroundColor,支持透明色值,补全基础能力。

四、核心诉求

透明窗口是弹窗类核心功能,恳请官方尽快适配鸿蒙平台透明页面能力,保持跨端统一,大幅降低老项目改造工作量。

收起阅读 »

终于解决了 uniapp X 的表情输入框的问题

准备写一个类似微信的输入框发现uniappx 使用 input 没法输入表情图片

使用富文本编辑框又出现了多一个 \n 换行,不适合聊天输入框

还好现在解决了,用AI写了个可以插入图片的输入框

准备写一个类似微信的输入框发现uniappx 使用 input 没法输入表情图片

使用富文本编辑框又出现了多一个 \n 换行,不适合聊天输入框

还好现在解决了,用AI写了个可以插入图片的输入框

猫拽uniapp跨平台低代码结合mimo2.5-pro模型

uni-app

猫拽低代码平台是一个面向跨平台应用开发的低代码解决方案,它允许开发者通过可视化拖拽和配置的方式,快速构建和发布 Web、移动端(H5)及小程序应用。其核心价值在于大幅降低了应用开发的技术门槛和周期。

平台主要功能包括:可视化页面设计器、数据模型构建、逻辑流编排、API 集成以及一键多端发布。

引入 小米 MIMO 2.5 Pro 模型测试,为应用赋予了先进的智能交互与决策能力。

官网:猫拽低代码平台

小米 MIMO 2.5 Pro 模型是小米公司推出的新一代多模态智能模型(Multi-modal Intelligent Model),是其 MIMO 系列模型的重要升级版本。该模型深度融合了视觉、语言、语音等多种模态的理解与生成能力,旨在为智能设备、人机交互和内容创作等领域提供强大的 AI 驱动核心。

强大的多模态理解与生成

  • 视觉理解:能够精准识别图像/视频中的物体、场景、文字、动作乃至情感元素。
  • 语言处理:支持超长上下文对话、复杂指令跟随、多语言翻译与创作。
  • 语音交互:具备高保真语音合成、实时语音识别与情感化语音交互能力。
  • 跨模态关联:实现“图文互生”、“语音控图”、“以文生视频”等跨模态任务。
  • 混合专家(MoE)架构:采用稀疏激活的专家网络,在保持庞大参数规模(据传达千亿级别)的同时,大幅降低推理计算成本。
  • 动态自适应推理:根据任务复杂度动态分配计算资源,简单任务快速响应,复杂任务深度处理。
  • 端云协同:支持模型部分能力下沉至设备端(如手机、IoT设备),实现低延迟、高隐私的本地智能,同时与云端大模型协同完成复杂任务。

小米 MIMO 2.5 Pro 模型 集成到 猫拽低代码平台,实质上是为可视化开发注入了“AI大脑”,创造了“1+1>2”的效应:

  1. 开发流程智能化:从“手动拖拽配置”迈向“描述即生成”。用户可以用自然语言提出需求,由 MIMO 2.5 Pro 理解并转化为平台可执行的构件,极大提升原型搭建速度。
  2. 交互体验个性化:生成的页面或应用内置了模型的智能交互能力。例如,一个电商详情页可以集成能“看懂”商品图片并回答问题的客服机器人,其能力直接来源于 MIMO 2.5 Pro。
  3. 多端体验一致化:模型的能力通过猫拽平台的多端发布引擎,可以无缝部署到 Web、小程序、App(通过 UniApp)等各个终端,确保智能体验的全渠道覆盖。
  4. 降低高级功能门槛:一些原本需要复杂编码实现的 AI 功能(如图像识别分类、智能推荐、内容审核),现在可以通过调用模型 API 并以低代码方式配置,让更多开发者能够触及 AI 能力。
继续阅读 »

猫拽低代码平台是一个面向跨平台应用开发的低代码解决方案,它允许开发者通过可视化拖拽和配置的方式,快速构建和发布 Web、移动端(H5)及小程序应用。其核心价值在于大幅降低了应用开发的技术门槛和周期。

平台主要功能包括:可视化页面设计器、数据模型构建、逻辑流编排、API 集成以及一键多端发布。

引入 小米 MIMO 2.5 Pro 模型测试,为应用赋予了先进的智能交互与决策能力。

官网:猫拽低代码平台

小米 MIMO 2.5 Pro 模型是小米公司推出的新一代多模态智能模型(Multi-modal Intelligent Model),是其 MIMO 系列模型的重要升级版本。该模型深度融合了视觉、语言、语音等多种模态的理解与生成能力,旨在为智能设备、人机交互和内容创作等领域提供强大的 AI 驱动核心。

强大的多模态理解与生成

  • 视觉理解:能够精准识别图像/视频中的物体、场景、文字、动作乃至情感元素。
  • 语言处理:支持超长上下文对话、复杂指令跟随、多语言翻译与创作。
  • 语音交互:具备高保真语音合成、实时语音识别与情感化语音交互能力。
  • 跨模态关联:实现“图文互生”、“语音控图”、“以文生视频”等跨模态任务。
  • 混合专家(MoE)架构:采用稀疏激活的专家网络,在保持庞大参数规模(据传达千亿级别)的同时,大幅降低推理计算成本。
  • 动态自适应推理:根据任务复杂度动态分配计算资源,简单任务快速响应,复杂任务深度处理。
  • 端云协同:支持模型部分能力下沉至设备端(如手机、IoT设备),实现低延迟、高隐私的本地智能,同时与云端大模型协同完成复杂任务。

小米 MIMO 2.5 Pro 模型 集成到 猫拽低代码平台,实质上是为可视化开发注入了“AI大脑”,创造了“1+1>2”的效应:

  1. 开发流程智能化:从“手动拖拽配置”迈向“描述即生成”。用户可以用自然语言提出需求,由 MIMO 2.5 Pro 理解并转化为平台可执行的构件,极大提升原型搭建速度。
  2. 交互体验个性化:生成的页面或应用内置了模型的智能交互能力。例如,一个电商详情页可以集成能“看懂”商品图片并回答问题的客服机器人,其能力直接来源于 MIMO 2.5 Pro。
  3. 多端体验一致化:模型的能力通过猫拽平台的多端发布引擎,可以无缝部署到 Web、小程序、App(通过 UniApp)等各个终端,确保智能体验的全渠道覆盖。
  4. 降低高级功能门槛:一些原本需要复杂编码实现的 AI 功能(如图像识别分类、智能推荐、内容审核),现在可以通过调用模型 API 并以低代码方式配置,让更多开发者能够触及 AI 能力。
收起阅读 »

input组件,type="number"时,maxlength失效

input

目前测试出在input组件的属性type=“number”时,maxlength会失效,使用uView Pro组件会导致输入值到最大值多次输入时,会多出一位值并伴随删除出现的闪烁效果,而且获取的值也不对,只有在type="text"正常,number无法使用

继续阅读 »

目前测试出在input组件的属性type=“number”时,maxlength会失效,使用uView Pro组件会导致输入值到最大值多次输入时,会多出一位值并伴随删除出现的闪烁效果,而且获取的值也不对,只有在type="text"正常,number无法使用

收起阅读 »

仁跃平台直充业务对接与使用指南

PHP

1. 功能概述

本系统已集成仁跃电子商务(Renyue)的虚拟商品直充接口。通过此功能,您可以实现:

  • 自动同步商品:一键获取仁跃平台的会员/充值类商品(如爱奇艺、腾讯视频会员等)。
  • 自动发货:用户下单并支付后,系统自动调用仁跃接口进行充值,无需人工干预。
  • 余额管理:实时同步仁跃账户余额,防止因余额不足导致充值失败。
  • 状态回调:接收仁跃平台的充值结果回调,自动更新订单状态。

适用场景:积分兑换商城、会员权益赠送、虚拟商品零售等。


2. 前置准备

在启用本功能前,请确保您已完成以下步骤:

  1. 注册仁跃账号:访问 仁跃官网 注册商户账号。
  2. 获取密钥信息:在仁跃后台获取以下关键信息:
    • MerchantNo (商户号)
    • MerchantKey (商户密钥/签名Key)
    • My Private Key (您的RSA私钥,用于签名生成)
    • RenYue Public Key (仁跃公钥,用于验签,通常由仁跃提供或固定)
  3. 充值余额确保仁跃账户内有足够的预付款余额以支持自动充值。

3. 系统配置

请在后台 系统配置 -> 商城(仁跃) 中填写以下参数:

配置项键名 (Key) 说明 示例/备注
renyuejt_url 仁跃API接口地址 通常为 https://api.renyuejt.com (请以官方文档为准)
renyuejt_merchant_no 商户号 从仁跃后台获取
renyuejt_merchant_sign 商户密钥 (MerchantKey) 用于生成签名
renyuejt_my_private_key 本地RSA私钥 注意:需包含 -----BEGIN PRIVATE KEY----- 头尾,格式需正确
renyuejt_freight_id 默认运费模板ID 虚拟商品通常设置为“免运费”模板ID
renyuejt_category_id 默认商品分类ID 同步的商品将归入此分类

4. 核心功能操作

4.1 同步商品列表

系统提供了自动同步仁跃商品的功能。

  • 操作方式
    • 手动同步:在后台商品管理页面点击“同步仁跃商品”按钮(如有)。
    • 定时任务:建议设置 Cron 定时任务,定期执行 \addons\smplive\library\renyuejtService::getCardDiscountList()
  • 同步逻辑
    1. 调用仁跃 getCardDiscountList 接口获取最新产品列表。
    2. 系统将当前商户下所有已有商品状态设为 hidden(隐藏)。
    3. 遍历返回的产品列表:
      • 若商品已存在(通过 third_id 匹配),则更新价格、库存等信息。
      • 若商品不存在,则创建新商品。
    4. 未在本次同步列表中出现的原有商品将保持隐藏状态(相当于下架)。
  • 图片匹配
    • 系统会根据商品名称,在 ShopThirdRenyuejtImg 表中查找匹配的图片。
    • 建议:在后台预先维护好常见会员(如“爱奇艺”、“腾讯”)的关键字与图片对应关系,以便同步时自动关联精美封面图。

4.2 查询账户余额

  • 方法\addons\smplive\library\renyuejtService::getCustomerDetail()
  • 用途:获取当前仁跃账户的剩余余额。
  • 展示:余额数据会更新至系统配置 renyuejt_money,可在后台仪表盘查看。
  • 建议:设置定时任务每小时同步一次余额,以便及时充值。

4.3 自动充值流程

当用户在平台购买虚拟商品并支付成功后,系统将自动触发充值:

  1. 订单校验
    • 检查订单是否属于仁跃商户 (shops_id = 11)。
    • 检查订单是否只包含1个商品,且数量为1
    • 检查商品是否有有效的 third_id (仁跃产品编码)。
  2. 提交充值
    • 调用仁跃 getOrderRechargeInfo 接口。
    • 传入参数:用户手机号 (mobile) 作为充值账号、产品编码、商户订单号等。
  3. 状态更新
    • 若接口返回成功 (CodeRes == 1000),系统将订单状态更新为 已发货 (shippingstate = 1),并记录仁跃返回的交易单号 (StoreNo)。
    • 若失败,记录错误日志到 ShopOrderAction,方便排查。

4.4 异步回调处理

仁跃平台会在充值完成后(成功或失败)向系统发送回调通知。

  • 回调地址/api/smplive/pay_notify/renyuejt
  • 处理逻辑
    1. 验签:使用 verify() 方法验证回调数据的签名,确保请求来自仁跃。
    2. 状态判断
      • RechargeStatus == 2:充值成功。系统将订单状态更新为 已完成 (shippingstate = 2)。
      • 其他状态:记录错误日志,便于后续人工介入或重试。
    3. 响应:向仁跃返回 success 字符串,确认收到通知。

5. 常见问题排查 (FAQ)

Q1: 同步商品时提示“解析失败”或无反应?

  • 检查网络:确保服务器能访问仁跃 API 地址。
  • 检查配置:确认 renyuejt_urlmerchant_nomerchant_sign 填写正确。
  • 查看日志:检查 runtime/log/ 下的日志文件,搜索 renyuejtService-curlRequest,查看具体的请求参数和返回结果。

Q2: 用户下单后未自动充值?

  • 检查商品编码:确认该商品在数据库中的 third_id 字段不为空,且与仁跃平台的产品编码一致。
  • 检查订单结构:仁跃直充接口目前仅支持单商品、单数量的订单。如果用户购物车中有多个商品或同一商品买了2个,系统将拒绝调用接口并在订单操作中记录原因。
  • 检查余额:确认仁跃账户余额充足。
  • 查看日志:搜索 renyuejt 关键词,查看 orderSubmit 方法的执行日志。

Q3: 回调验签失败?

  • 检查公钥/私钥:确认配置中的 renyuejt_my_private_key 格式正确(通常验签需要用到仁跃的公钥,请确认代码中 verify 方法使用的密钥是否与仁跃文档要求一致。注:当前代码使用的是本地私钥解密ReturnSign,请核对仁跃最新文档是否变更了验签方式)。
  • 检查时间戳:确保服务器时间与标准时间同步,避免 TimeStamp 偏差过大导致签名失效。

Q4: 如何自定义商品图片?

  • 系统通过 findImg 方法模糊匹配商品名称和图片标题。
  • 请在后台管理 ShopThirdRenyuejtImg 表(或通过专门的管理页面),添加关键字(如“爱奇艺”)对应的图片URL。
  • 例如:添加一条记录,title 为 "爱奇艺",image 为 "https://example.com/iqiyi.jpg"。当同步到“爱奇艺黄金会员月卡”时,系统会自动使用该图片。

6. 开发参考 (For Developers)

如果您需要二次开发或调试,可以参考以下核心方法:

use addons\smplive\library\renyuejtService;  

// 1. 同步商品  
$result = renyuejtService::getCardDiscountList();  

// 2. 查询余额  
$balanceInfo = renyuejtService::getCustomerDetail();  

// 3. 手动触发订单充值 (通常由支付成功回调自动触发)  
$order = ShopOrder::get($orderId);  
$success = renyuejtService::orderSubmit($order);

签名算法说明:

  1. 参数按 ASCII 码字典序升序排序。
  2. 拼接成 key=value&key=value... 格式。
  3. 末尾拼接 &MerchantKey=YOUR_KEY
  4. 使用 SHA256WithRSA 算法,利用本地私钥对字符串进行签名。
  5. Base64 编码得到 SignSecret

温馨提示:虚拟商品交易涉及资金安全,请务必妥善保管商户密钥和私钥,不要泄露给他人。建议在生产环境开启详细的日志记录,以便追踪每一笔充值请求。

更多技术介绍在https://smplive.wpygo.com/

DCloud 插件市场**
便于直接在 HBuilderX 中导入使用:
点击查看插件详情https://ext.dcloud.net.cn/plugin?id=26606

Gitee 代码仓库**
获取完整源代码及提交历史:
访问仓库地址 https://gitee.com/mldxmy/simplelive

继续阅读 »

1. 功能概述

本系统已集成仁跃电子商务(Renyue)的虚拟商品直充接口。通过此功能,您可以实现:

  • 自动同步商品:一键获取仁跃平台的会员/充值类商品(如爱奇艺、腾讯视频会员等)。
  • 自动发货:用户下单并支付后,系统自动调用仁跃接口进行充值,无需人工干预。
  • 余额管理:实时同步仁跃账户余额,防止因余额不足导致充值失败。
  • 状态回调:接收仁跃平台的充值结果回调,自动更新订单状态。

适用场景:积分兑换商城、会员权益赠送、虚拟商品零售等。


2. 前置准备

在启用本功能前,请确保您已完成以下步骤:

  1. 注册仁跃账号:访问 仁跃官网 注册商户账号。
  2. 获取密钥信息:在仁跃后台获取以下关键信息:
    • MerchantNo (商户号)
    • MerchantKey (商户密钥/签名Key)
    • My Private Key (您的RSA私钥,用于签名生成)
    • RenYue Public Key (仁跃公钥,用于验签,通常由仁跃提供或固定)
  3. 充值余额确保仁跃账户内有足够的预付款余额以支持自动充值。

3. 系统配置

请在后台 系统配置 -> 商城(仁跃) 中填写以下参数:

配置项键名 (Key) 说明 示例/备注
renyuejt_url 仁跃API接口地址 通常为 https://api.renyuejt.com (请以官方文档为准)
renyuejt_merchant_no 商户号 从仁跃后台获取
renyuejt_merchant_sign 商户密钥 (MerchantKey) 用于生成签名
renyuejt_my_private_key 本地RSA私钥 注意:需包含 -----BEGIN PRIVATE KEY----- 头尾,格式需正确
renyuejt_freight_id 默认运费模板ID 虚拟商品通常设置为“免运费”模板ID
renyuejt_category_id 默认商品分类ID 同步的商品将归入此分类

4. 核心功能操作

4.1 同步商品列表

系统提供了自动同步仁跃商品的功能。

  • 操作方式
    • 手动同步:在后台商品管理页面点击“同步仁跃商品”按钮(如有)。
    • 定时任务:建议设置 Cron 定时任务,定期执行 \addons\smplive\library\renyuejtService::getCardDiscountList()
  • 同步逻辑
    1. 调用仁跃 getCardDiscountList 接口获取最新产品列表。
    2. 系统将当前商户下所有已有商品状态设为 hidden(隐藏)。
    3. 遍历返回的产品列表:
      • 若商品已存在(通过 third_id 匹配),则更新价格、库存等信息。
      • 若商品不存在,则创建新商品。
    4. 未在本次同步列表中出现的原有商品将保持隐藏状态(相当于下架)。
  • 图片匹配
    • 系统会根据商品名称,在 ShopThirdRenyuejtImg 表中查找匹配的图片。
    • 建议:在后台预先维护好常见会员(如“爱奇艺”、“腾讯”)的关键字与图片对应关系,以便同步时自动关联精美封面图。

4.2 查询账户余额

  • 方法\addons\smplive\library\renyuejtService::getCustomerDetail()
  • 用途:获取当前仁跃账户的剩余余额。
  • 展示:余额数据会更新至系统配置 renyuejt_money,可在后台仪表盘查看。
  • 建议:设置定时任务每小时同步一次余额,以便及时充值。

4.3 自动充值流程

当用户在平台购买虚拟商品并支付成功后,系统将自动触发充值:

  1. 订单校验
    • 检查订单是否属于仁跃商户 (shops_id = 11)。
    • 检查订单是否只包含1个商品,且数量为1
    • 检查商品是否有有效的 third_id (仁跃产品编码)。
  2. 提交充值
    • 调用仁跃 getOrderRechargeInfo 接口。
    • 传入参数:用户手机号 (mobile) 作为充值账号、产品编码、商户订单号等。
  3. 状态更新
    • 若接口返回成功 (CodeRes == 1000),系统将订单状态更新为 已发货 (shippingstate = 1),并记录仁跃返回的交易单号 (StoreNo)。
    • 若失败,记录错误日志到 ShopOrderAction,方便排查。

4.4 异步回调处理

仁跃平台会在充值完成后(成功或失败)向系统发送回调通知。

  • 回调地址/api/smplive/pay_notify/renyuejt
  • 处理逻辑
    1. 验签:使用 verify() 方法验证回调数据的签名,确保请求来自仁跃。
    2. 状态判断
      • RechargeStatus == 2:充值成功。系统将订单状态更新为 已完成 (shippingstate = 2)。
      • 其他状态:记录错误日志,便于后续人工介入或重试。
    3. 响应:向仁跃返回 success 字符串,确认收到通知。

5. 常见问题排查 (FAQ)

Q1: 同步商品时提示“解析失败”或无反应?

  • 检查网络:确保服务器能访问仁跃 API 地址。
  • 检查配置:确认 renyuejt_urlmerchant_nomerchant_sign 填写正确。
  • 查看日志:检查 runtime/log/ 下的日志文件,搜索 renyuejtService-curlRequest,查看具体的请求参数和返回结果。

Q2: 用户下单后未自动充值?

  • 检查商品编码:确认该商品在数据库中的 third_id 字段不为空,且与仁跃平台的产品编码一致。
  • 检查订单结构:仁跃直充接口目前仅支持单商品、单数量的订单。如果用户购物车中有多个商品或同一商品买了2个,系统将拒绝调用接口并在订单操作中记录原因。
  • 检查余额:确认仁跃账户余额充足。
  • 查看日志:搜索 renyuejt 关键词,查看 orderSubmit 方法的执行日志。

Q3: 回调验签失败?

  • 检查公钥/私钥:确认配置中的 renyuejt_my_private_key 格式正确(通常验签需要用到仁跃的公钥,请确认代码中 verify 方法使用的密钥是否与仁跃文档要求一致。注:当前代码使用的是本地私钥解密ReturnSign,请核对仁跃最新文档是否变更了验签方式)。
  • 检查时间戳:确保服务器时间与标准时间同步,避免 TimeStamp 偏差过大导致签名失效。

Q4: 如何自定义商品图片?

  • 系统通过 findImg 方法模糊匹配商品名称和图片标题。
  • 请在后台管理 ShopThirdRenyuejtImg 表(或通过专门的管理页面),添加关键字(如“爱奇艺”)对应的图片URL。
  • 例如:添加一条记录,title 为 "爱奇艺",image 为 "https://example.com/iqiyi.jpg"。当同步到“爱奇艺黄金会员月卡”时,系统会自动使用该图片。

6. 开发参考 (For Developers)

如果您需要二次开发或调试,可以参考以下核心方法:

use addons\smplive\library\renyuejtService;  

// 1. 同步商品  
$result = renyuejtService::getCardDiscountList();  

// 2. 查询余额  
$balanceInfo = renyuejtService::getCustomerDetail();  

// 3. 手动触发订单充值 (通常由支付成功回调自动触发)  
$order = ShopOrder::get($orderId);  
$success = renyuejtService::orderSubmit($order);

签名算法说明:

  1. 参数按 ASCII 码字典序升序排序。
  2. 拼接成 key=value&key=value... 格式。
  3. 末尾拼接 &MerchantKey=YOUR_KEY
  4. 使用 SHA256WithRSA 算法,利用本地私钥对字符串进行签名。
  5. Base64 编码得到 SignSecret

温馨提示:虚拟商品交易涉及资金安全,请务必妥善保管商户密钥和私钥,不要泄露给他人。建议在生产环境开启详细的日志记录,以便追踪每一笔充值请求。

更多技术介绍在https://smplive.wpygo.com/

DCloud 插件市场**
便于直接在 HBuilderX 中导入使用:
点击查看插件详情https://ext.dcloud.net.cn/plugin?id=26606

Gitee 代码仓库**
获取完整源代码及提交历史:
访问仓库地址 https://gitee.com/mldxmy/simplelive

收起阅读 »

PHP 对接各类支付接口心得各银行支付/各种支付平台/php对接支付接口心得/php h5支付接口

支付

前言

本人从事软件开发工作已有 15 余年。早期有 5 年时间专注于直播行业开发,随后转型从事商城系统开发。

在直播行业期间,主要模式是将软件销售给客户,并根据客户需求进行定制化功能修改。由于部分客户群体(如秀场直播等)无法直接对接银行、微信或支付宝等主流支付渠道,他们往往自行寻找第三方支付平台,并要求我将其接入系统中。因此,我积累了大量不同支付接口的对接经验。

后期转向商城开发后,为了利用银行的营销补贴活动(例如:某银行推广网上支付,用户支付 38 元立减 20 元,实际用户支付 18 元即可获得 38 元商品,差额由银行补贴),我又直接对接了多家银行的支付接口。

技术选型策略:统一 H5 支付接口

我们的支付场景覆盖 PC 端、H5 网页、Android App、iOS App 以及微信小程序。为了降低维护成本,除微信和支付宝使用原生 SDK 外,其他所有支付渠道均统一接入 H5 支付接口

这种策略的优势在于:

  • 代码复用率高:一套核心逻辑可服务于多个终端。
  • 维护成本低:无需为每个平台单独维护一套支付逻辑。
  • 兼容性较好:H5 页面在 App 内通过 WebView 加载,或在浏览器中直接打开,体验相对统一。

通用支付流程

除中信银行等特殊案例外,大多数支付流程如下:

  1. 发起请求用户在商户平台(我方开发系统)选择充值金额(如 100 元)及支付方式(如 A 支付)。
  2. 跳转网关:系统生成订单并跳转至 A 支付的网关页面。
  3. 用户支付:用户在网关页面完成支付操作。
  4. 回调验证:支付完成后,用户跳回商户平台。同时,支付平台异步通知商户服务器。
  5. 业务处理:商户服务器验证签名及数据合法性,确认无误后为用户账户充值相应金额。

开发效率与沟通成本分析

接入一个支付平台的纯开发时间通常在 半天到 1 周 之间(不包含前期沟通与审核时间)。不同机构的对接难度差异巨大:

1. 高效案例:招商银行一网通

  • 开发耗时:约半天。
  • 优势:文档完善,Demo 齐全,提供测试账号。
  • 沟通:拥有专属微信沟通群,遇到问题可直接咨询银行技术人员,响应迅速。

2. 困难案例:中信银行

  • 开发耗时:纯开发约 1 周,但整体周期长达 2 个月。
  • 劣势:文档和 Demo 不完整。
  • 沟通瓶颈:审核流程繁琐,需多次发送邮件沟通,每次审核耗时 1 周或更久。在审核期间无法进行下一步开发,极大拉长项目周期。

3. 一般规律

  • 小型第三方支付:接入简单,签名算法通常仅为 MD5,从开发到上线可在 1 天内完成。
  • 银行系支付:相对复杂,常使用 SHA256 等更安全的签名算法,且线下审批流程各异。招商银行流程顺畅,而中信银行等则沟通成本极高。

各支付平台对接详情

以下列出我曾对接过的 16 种支付渠道,并对重点渠道进行简要说明。

主流支付

1. 支付宝

  • 特点:文档极其完善,Demo 丰富,社区资料多。
  • 开发体验:无需沟通客服。下载官方 Demo,替换配置参数,调整跳转逻辑及回调处理即可快速完成。
  • 官方文档支付宝开放平台

2. 微信支付

  • 特点:文档规范,无人工客服支持。
  • 开发体验:无需沟通。下载 Demo,修改配置,处理支付发起与回调逻辑即可。
  • 官方文档微信支付 H5 开发文档

银行系支付

3. 招商银行一网通支付

4. 光大银行 H5 支付

5. 中国农业银行 H5 支付

6. 宁波银行 H5 支付

7. 中信银行 H5 支付

第三方支付平台

8. 国边四方支付 (bbnpay)

  • 状态:官网已无法访问,不再详细介绍。

9. 网银在线 (chinabank)

10. 国付支付 (guofu)

  • 状态:官网已无法访问,不再详细介绍。

11. 汇银通支付 (huiyintongpay)

  • 状态:官网已无法访问,不再详细介绍。

12. IPS 支付 (ips17)

  • 状态:官网已无法访问,不再详细介绍。

13. 快钱支付 (kuaiqian)

14. 连连支付 (llpay)

15. 通汇支付 (tonghui)

  • 官网:http://41.cn/
  • 状态:官网已无法访问,不再详细介绍。

16. 易宝支付 (yee)

总结

在支付接口对接工作中,“文档质量”“沟通渠道” 是决定开发效率的关键因素。

  • 推荐优先选择:支付宝、微信、招商银行、网银在线、易宝支付、连连支付、快钱支付。这些平台文档健全,流程规范,能显著缩短开发周期。
  • 需谨慎选择:沟通流程冗长、文档缺失或官网稳定性差的中小型支付平台。虽然初期接入可能看似简单,但后续的维护风险和沟通成本可能远超预期。

希望以上经验能为正在面临支付选型和对接开发的同行提供参考。

继续阅读 »

前言

本人从事软件开发工作已有 15 余年。早期有 5 年时间专注于直播行业开发,随后转型从事商城系统开发。

在直播行业期间,主要模式是将软件销售给客户,并根据客户需求进行定制化功能修改。由于部分客户群体(如秀场直播等)无法直接对接银行、微信或支付宝等主流支付渠道,他们往往自行寻找第三方支付平台,并要求我将其接入系统中。因此,我积累了大量不同支付接口的对接经验。

后期转向商城开发后,为了利用银行的营销补贴活动(例如:某银行推广网上支付,用户支付 38 元立减 20 元,实际用户支付 18 元即可获得 38 元商品,差额由银行补贴),我又直接对接了多家银行的支付接口。

技术选型策略:统一 H5 支付接口

我们的支付场景覆盖 PC 端、H5 网页、Android App、iOS App 以及微信小程序。为了降低维护成本,除微信和支付宝使用原生 SDK 外,其他所有支付渠道均统一接入 H5 支付接口

这种策略的优势在于:

  • 代码复用率高:一套核心逻辑可服务于多个终端。
  • 维护成本低:无需为每个平台单独维护一套支付逻辑。
  • 兼容性较好:H5 页面在 App 内通过 WebView 加载,或在浏览器中直接打开,体验相对统一。

通用支付流程

除中信银行等特殊案例外,大多数支付流程如下:

  1. 发起请求用户在商户平台(我方开发系统)选择充值金额(如 100 元)及支付方式(如 A 支付)。
  2. 跳转网关:系统生成订单并跳转至 A 支付的网关页面。
  3. 用户支付:用户在网关页面完成支付操作。
  4. 回调验证:支付完成后,用户跳回商户平台。同时,支付平台异步通知商户服务器。
  5. 业务处理:商户服务器验证签名及数据合法性,确认无误后为用户账户充值相应金额。

开发效率与沟通成本分析

接入一个支付平台的纯开发时间通常在 半天到 1 周 之间(不包含前期沟通与审核时间)。不同机构的对接难度差异巨大:

1. 高效案例:招商银行一网通

  • 开发耗时:约半天。
  • 优势:文档完善,Demo 齐全,提供测试账号。
  • 沟通:拥有专属微信沟通群,遇到问题可直接咨询银行技术人员,响应迅速。

2. 困难案例:中信银行

  • 开发耗时:纯开发约 1 周,但整体周期长达 2 个月。
  • 劣势:文档和 Demo 不完整。
  • 沟通瓶颈:审核流程繁琐,需多次发送邮件沟通,每次审核耗时 1 周或更久。在审核期间无法进行下一步开发,极大拉长项目周期。

3. 一般规律

  • 小型第三方支付:接入简单,签名算法通常仅为 MD5,从开发到上线可在 1 天内完成。
  • 银行系支付:相对复杂,常使用 SHA256 等更安全的签名算法,且线下审批流程各异。招商银行流程顺畅,而中信银行等则沟通成本极高。

各支付平台对接详情

以下列出我曾对接过的 16 种支付渠道,并对重点渠道进行简要说明。

主流支付

1. 支付宝

  • 特点:文档极其完善,Demo 丰富,社区资料多。
  • 开发体验:无需沟通客服。下载官方 Demo,替换配置参数,调整跳转逻辑及回调处理即可快速完成。
  • 官方文档支付宝开放平台

2. 微信支付

  • 特点:文档规范,无人工客服支持。
  • 开发体验:无需沟通。下载 Demo,修改配置,处理支付发起与回调逻辑即可。
  • 官方文档微信支付 H5 开发文档

银行系支付

3. 招商银行一网通支付

4. 光大银行 H5 支付

5. 中国农业银行 H5 支付

6. 宁波银行 H5 支付

7. 中信银行 H5 支付

第三方支付平台

8. 国边四方支付 (bbnpay)

  • 状态:官网已无法访问,不再详细介绍。

9. 网银在线 (chinabank)

10. 国付支付 (guofu)

  • 状态:官网已无法访问,不再详细介绍。

11. 汇银通支付 (huiyintongpay)

  • 状态:官网已无法访问,不再详细介绍。

12. IPS 支付 (ips17)

  • 状态:官网已无法访问,不再详细介绍。

13. 快钱支付 (kuaiqian)

14. 连连支付 (llpay)

15. 通汇支付 (tonghui)

  • 官网:http://41.cn/
  • 状态:官网已无法访问,不再详细介绍。

16. 易宝支付 (yee)

总结

在支付接口对接工作中,“文档质量”“沟通渠道” 是决定开发效率的关键因素。

  • 推荐优先选择:支付宝、微信、招商银行、网银在线、易宝支付、连连支付、快钱支付。这些平台文档健全,流程规范,能显著缩短开发周期。
  • 需谨慎选择:沟通流程冗长、文档缺失或官网稳定性差的中小型支付平台。虽然初期接入可能看似简单,但后续的维护风险和沟通成本可能远超预期。

希望以上经验能为正在面临支付选型和对接开发的同行提供参考。

收起阅读 »