// 在客户端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;
}
}