支付宝小游戏开发接入指南
概述
作为小游戏开发者,接入支付宝小游戏平台需要实现用户登录、支付、文本检测、角色上报等核心功能。本文将从实际开发角度,详细介绍如何利用支付宝小游戏的my对象API完成这些功能的接入。
开发环境准备
1. 支付宝开发者工具
- 下载并安装支付宝小程序开发者工具
- 创建小游戏项目
- 配置游戏基本信息
2. 权限申请
- 在支付宝开放平台申请小游戏权限
- 配置支付权限和用户信息权限
- 获取AppID等必要参数
核心功能实现
1. 用户登录实现
支付宝小游戏使用my.getAuthCode获取用户授权码,这是用户身份验证的核心:
// 用户登录功能
async function userLogin() {try {console.log('开始支付宝小游戏登录');// 调用支付宝登录APIconst loginResult = await new Promise((resolve, reject) => {my.getAuthCode({scopes: 'auth_base', // 使用基础授权方式success: function(res) {console.log('my.getAuthCode success:', res);resolve({authCode: res.authCode || '',authSuccessScopes: res.authSuccessScopes || [],authErrorScopes: res.authErrorScopes || {},code: res.authCode || '' // 授权码});},fail: function(err) {console.error('my.getAuthCode fail:', err);reject(err);}});});if (loginResult && loginResult.code) {// 登录成功,保存用户信息console.log('登录成功,授权码:', loginResult.code);// 这里可以将授权码发送到你的服务器进行验证// 服务器验证后返回用户ID等信息return {success: true,authCode: loginResult.code,message: '登录成功'};} else {return {success: false,message: '登录失败'};}} catch (error) {console.error('支付宝登录异常:', error);return {success: false,message: '登录异常'};}
}
2. 支付功能实现
支付是小游戏的重要变现方式,使用my.requestGamePayment实现。在实现支付功能前,需要先检查支付宝版本是否支持支付:
// 版本号比较函数
function compareVersion(version, compareVersion) {const v1 = version.split('.').map(num => parseInt(num, 10));const v2 = compareVersion.split('.').map(num => parseInt(num, 10));const len = Math.max(v1.length, v2.length);for (let i = 0; i < len; i++) {const n1 = v1[i] || 0;const n2 = v2[i] || 0;if (n1 > n2) return 1;if (n1 < n2) return -1;}return 0;
}// 获取系统信息
function getSystemInfo() {return my.getSystemInfoSync();
}// 游戏内支付功能
async function gamePayment(orderInfo) {try {// 检查支付宝版本是否支持支付const systemInfo = getSystemInfo();console.log('支付宝版本:', systemInfo.version);// 支付功能需要支付宝版本 >= 10.3.90if (compareVersion(systemInfo.version || "0", "10.3.90") <= 0) {console.log('支付暂不支持');return {success: false,message: '当前支付宝暂不支持支付,请先升级支付宝'};}console.log('开始支付宝小游戏支付:', orderInfo);// 构建支付参数const payParams = {buyQuantity: orderInfo.buy_quantity, // 购买数量customId: orderInfo.order_id, // 订单IDextraInfo: {ext: orderInfo.ext // 扩展信息}};console.log('支付宝支付参数:', payParams);// 调用支付宝支付APIawait new Promise((resolve, reject) => {my.requestGamePayment({...payParams,success: function() {console.log('支付宝支付成功');resolve({success: true,message: '支付成功',orderId: orderInfo.order_id});},fail: function(res) {console.log('支付宝支付失败:', res);// 处理未成年人限制if (res.error == 15215) {my.showModal({title: '提示',content: '您好,基于国家新闻出版署《关于防止未成年人沉迷网络游戏的通知》的规定,支付宝限制未成年人游戏充值哦。',showCancel: false,confirmText: '确定',success: function() {reject({success: false,message: '未成年人限制',errorCode: res.error});}});return;}reject({success: false,message: `支付失败: ${res.errorMessage || res.error || '未知错误'}`,errorCode: res.error});}});});} catch (error) {console.error('支付宝支付异常:', error);return {success: false,message: '支付异常'};}
}
3. 文本安全检测
为了确保游戏内用户生成内容的安全性,需要实现文本检测功能:
// 文本安全检测
async function textSecurityCheck(text, userId) {try {console.log('开始支付宝文本验证:', text);// 调用你的后端API进行文本检测const response = await fetch('/api/text-check', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({third_uid: userId,content: text,channel: 'zfb'})});const result = await response.json();console.log('支付宝文本检测响应:', result);// 根据接口返回结果判断是否通过检测const isSafe = result.code === 0;console.log('支付宝文本检测结果:', isSafe);return isSafe;} catch (error) {console.error('支付宝文本验证异常:', error);return false; // 检测异常时默认不通过}
}// 使用示例
async function sendChatMessage(message, userId) {const isSafe = await textSecurityCheck(message, userId);if (isSafe) {// 文本安全,可以发送console.log('消息发送成功');} else {// 文本不安全,提示用户my.showToast({content: '消息包含敏感内容,请重新输入',type: 'none'});}
}
4. 角色信息上报
根据游戏运营需求,需要定期上报玩家角色信息:
// 角色信息上报
let lastLevelReportTime = 0; // 等级上报频率限制async function reportRoleInfo(roleInfo) {try {console.log('支付宝角色信息上报:', roleInfo);// 等级上报频率限制(60秒内只能上报一次)if (roleInfo.data_type === 3) { // 3表示等级上报const now = Date.now();if (now - lastLevelReportTime < 60000) {console.log('等级上报频率限制,等待中...');return { success: false, message: 'awating...' };}lastLevelReportTime = now;}// 调用后端API上报角色信息const response = await fetch('/api/role-report', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({...roleInfo,channel: 'zfb'})});const result = await response.json();console.log('角色信息上报结果:', result);return result;} catch (error) {console.error('支付宝角色信息上报异常:', error);return { success: false, message: '上报异常' };}
}// 使用示例
async function onPlayerLevelUp(newLevel) {await reportRoleInfo({data_type: 3, // 等级上报role_id: 'player_001',role_name: '玩家昵称',role_level: newLevel,server_id: 'server_001',server_name: '服务器名称'});
}
常用API使用
1. 弹窗提示
// 显示模态弹窗
function showAlert(title, content) {my.showModal({title: title,content: content,showCancel: false,confirmText: '确定',success: function(res) {console.log('用户点击确定');}});
}// 显示Toast提示
function showToast(message) {my.showToast({content: message,type: 'none',duration: 2000});
}
2. 数据存储
// 保存数据到本地存储
function saveGameData(key, data) {my.setStorage({key: key,data: data,success: function() {console.log('数据保存成功');},fail: function(err) {console.error('数据保存失败:', err);}});
}// 读取本地存储数据
function loadGameData(key) {return new Promise((resolve, reject) => {my.getStorage({key: key,success: function(res) {resolve(res.data);},fail: function(err) {reject(err);}});});
}
3. 网络请求
// 发送HTTP请求
async function httpRequest(url, data) {try {const response = await new Promise((resolve, reject) => {my.request({url: url,method: 'POST',data: data,header: {'Content-Type': 'application/json'},success: function(res) {resolve(res);},fail: function(err) {reject(err);}});});return response.data;} catch (error) {console.error('网络请求失败:', error);throw error;}
}
错误处理最佳实践
1. API兼容性检查
// 检查API是否支持
function checkApiSupport(apiName) {if (my.canIUse(apiName)) {return true;} else {console.warn(`当前环境不支持 ${apiName}`);return false;}
}// 使用示例
if (checkApiSupport('showActionSheet')) {my.showActionSheet({itemList: ['选项1', '选项2', '选项3'],success: function(res) {console.log('用户选择了:', res.tapIndex);}});
} else {// 降级处理console.log('不支持ActionSheet,使用其他方式');
}
2. 异常捕获
// 统一的异常处理
function handleError(error, context) {console.error(`${context} 发生错误:`, error);// 可以上报错误到服务器// reportError(error, context);// 显示用户友好的错误提示my.showToast({content: '操作失败,请重试',type: 'none'});
}// 使用示例
try {await userLogin();
} catch (error) {handleError(error, '用户登录');
}
开发调试技巧
1. 日志输出
// 开发环境日志
const DEBUG = true;function debugLog(message, data) {if (DEBUG) {console.log(`[DEBUG] ${message}`, data);}
}// 使用示例
debugLog('用户登录开始', { timestamp: Date.now() });
总结
通过以上实现,我们完成了支付宝小游戏的核心功能接入:
- 用户登录:使用
my.getAuthCode获取用户授权 - 支付功能:通过
my.requestGamePayment实现游戏内购买,并加入版本校验确保兼容性 - 文本检测:确保用户内容安全
- 角色上报:满足游戏运营需求
- 错误处理:完善的异常处理机制
这些功能构成了支付宝小游戏开发的基础框架,开发者可以根据具体游戏需求进行扩展和优化。在实际开发中,建议:
- 充分测试各种异常情况
- 做好API兼容性检查
- 实现完善的日志记录
- 关注支付宝平台的政策更新
- 特别注意支付功能的版本兼容性,确保在低版本支付宝中给出友好提示
通过这套方案,可以快速完成支付宝小游戏的接入,为玩家提供流畅的游戏体验。
