敬告:此 demo 演示为开放测试页面,仅用于开发者快速测试体验应用功能,请严格遵守开发者协议,九游会国际-九游会真人第一品牌。
♦ js-sdk 引用方式:
♦ 普通网页 script 方式加载:下载最新版 ,请在页面上调用 jsbridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge
可能由于家长控制等原因,当前设备不支持app内购买,在发起内购前可以先判断是否支持。
jsbridge.iap.canmakepayments(function(yes) { alert(yes ? "支持内购" : "不支持内购"); });
jsbridge.iap.getproducts({ //你在 https://appstoreconnect.apple.com/ 创建的产品id数组 productids: [ "com.yidiantongqa.app.vip30", "com.yidiantongqa.app.vip60", "com.yidiantongqa.app.vip360" ] }, function(succ, products) { if (succ) { alert(json.stringify(products)); } else { alert("操作失败\n" json.stringify(products)); } }); /** products 返回产品信息 { invalidproductids:[] //无效的产品id,如果你提供了无效的产品id,会在这里返回,数组类型 products: //有效的产品信息,数组类型 [{ productid: //产品id,字符串类型 title: //产品标题,字符串类型 description: //产品描述,字符串类型 price: //产品价格,数字类型 formattedprice: //产品格式化后的价格,如¥6.00,字符串类型 downloadable: //是否有下载内容,布尔类型 downloadcontentlengths: //下载内容长度,数字组成的数组 downloadcontentversion: //下载内容的版本,字符串类型 }] } **/
• 调用 getunfinishedtransactions/purchase/restoretransactions/finishtransaction 方法之前应设置本监听器,所有交易状态变更都会通知到此监听器。
• 系统以数组形式将交易信息传递给回调参数 transactions
• 如果多次设置监听器,只有最后一个才会收到通知。
jsbridge.iap.settransanctionlistener(function(succ, transactions) { if (succ) { var json = json.stringify(transactions); jsbridge.setclipboardtext(json); //transactions.foreach(function(x){jsbridge.iap.finishtransaction({transactionid: x.transactionid});}) alert(json); } else { alert("操作失败\n" json.stringify(transactions)); } }); alert("已设置监听器"); /** transactions 返回交易信息数组 [{ state: //交易状态,详见交易状态常量,数字类型 transactionid: //交易id,字符串类型 originaltransactionid: //原始交易id,只在state为恢复购买时有效,字符串类型 transactiondate: //交易时间,unix 时间戳(秒) receipt: //交易凭证,经过base64编码,用于验证交易是否合法和有效,避免因越狱破解内购后造成损失,只在state为购买成功时有效,字符串类型 errorcode: //交易失败时的错误码,数字类型 errormsg: //交易失败时的说明,字符串类型 payment: //商品购买信息 { productid: //商品id,字符串类型 quantity: //购买数量,数字类型 applicationusername: //用户信息,字符串类型 }, downloads: //有下载内容时的下载信息列表 [{ state: //下载状态,详见下载状态常量,数字类型 transactionid: //下载内容所属交易id,字符串类型 contentid: //下载内容id,字符串类型 progress: //下载进度,取值范围0~1,数字类型 contentlength: //文件内容大小,数字类型 timeremaining: //下载剩余时间,-1时表示未知,数字类型 contentversion: //下载内容的版本,字符串类型 contenturl: //下载成功后文件路径,字符串类型 errorcode: //下载失败时的错误码,数字类型 errormsg: //下载失败时的错误描述,字符串类型 }] }] state(transaction) 交易状态常量说明 0: 已加入交易队列(transaction is being added to the server queue.) 1: 交易完成(transaction is in queue, user has been charged. client should complete the transaction.) 2: 交易失败(transaction was cancelled or failed before being added to the server queue.) 3: 恢复购买(transaction was restored from user's purchase history. client should complete the transaction.) 4: 交易等待被确认(the transaction is in the queue, but its final status is pending external action.) state(download) 下载状态常量说明 0: 等待下载(download is inactive, waiting to be downloaded) 1: 正在下载(download is actively downloading) 2: 暂停下载(download was paused by the user) 3: 下载完成(download is finished, content is available) 4: 下载失败(download failed) 5: 取消下载(download was cancelled) **/
请在 settransanctionlistener 中接收交易数据
jsbridge.iap.getunfinishedtransactions();
请在 settransanctionlistener 中接收交易数据
jsbridge.iap.purchase({ //你在 https://appstoreconnect.apple.com/ 创建的产品id productid : "com.yidiantongqa.app.vip60", //可选,购买数量,不小于1的整数,默认1 quantity : 1, //可选,用户信息,交易回调里面原样返回,默认空 applicationusername: "mystring" });
请在 settransanctionlistener 中接收交易数据
jsbridge.iap.restoretransactions();
• 在完成购买并提供给用户相关功能后应该完成此次交易;
• finishtransaction 成功后,此交易将从 unfinishedtransactions 队列中移除;
• 请在 settransanctionlistener 中接收交易数据;
jsbridge.iap.finishtransaction({ //交易id transactionid: "3a266867-8275-4299-9bef-ff7a8a207d21" });
• 调用 startdownloads/pausedownloads/resumedownloads/canceldownloads 方法之前应设置本监听器,所有下载状态变更都会通知到此监听器。
• 系统以数组形式将下载信息传递给回调参数 downloads
• 如果多次设置监听器,只有最后一个才会收到通知。
jsbridge.iap.setdownloadlistener(function(succ, downloads) { if (succ) { alert(json.stringify(downloads)); } else { alert("操作失败\n" json.stringify(downloads)); } }); alert("已设置监听器"); /** downloads 下载信息数组 [{ state: //下载状态,详见settransanctionlistener的下载状态常量说明,数字类型 transactionid: //下载内容所属交易id,字符串类型 contentid: //下载内容id,字符串类型 progress: //下载进度,取值范围0~1,数字类型 contentlength: //文件内容大小,数字类型 timeremaining: //下载剩余时间,-1时表示未知,数字类型 contentversion://下载内容的版本,字符串类型 contenturl: //下载成功后文件路径,字符串类型 errorcode: //下载失败时的错误码,数字类型 errormsg: //下载失败时的错误描述,字符串类型 }] **/
请在 setdownloadlistener 中接收下载信息
jsbridge.iap.startdownloads({ //下载内容id组成的数组 contentids: [ "contentid1", "contentid2", "..." ] });
请在 setdownloadlistener 中接收下载信息
jsbridge.iap.pausedownloads({ //下载内容id组成的数组 contentids: [ "contentid1", "contentid2", "..." ] });
请在 setdownloadlistener 中接收下载信息
jsbridge.iap.resumedownloads({ //下载内容id组成的数组 contentids: [ "contentid1", "contentid2", "..." ] });
请在 setdownloadlistener 中接收下载信息
jsbridge.iap.canceldownloads({ //下载内容id组成的数组 contentids: [ "contentid1", "contentid2", "..." ] });
♦ 接入流程请参考 这里
♦ 关于自动续期订阅类商品:、
♦ 苹果官方文档
♦ 沙盒凭证验证接口
♦ 生产环境凭证验证接口
♦ 注意,app上架审核时苹果审核员用的是沙盒账户;
♦ 识别沙盒环境下收据的方法有两种:
1.根据凭证验证返回的字段 environment = sandbox。
2.根据凭证验证返回的状态码,如果 status = 21007,则表示当前的收据为沙盒环境下凭证;♦ 构造json { "receipt-data" : "(receipt 支付凭证)" } post 到苹果的验证接口,处理返回结果即可。