• uniapp苹果内购总结



    对于app内有虚拟物品交易的,一律需要接上苹果支付,
    uniapp支付文档: https://uniapp.dcloud.net.cn/api/plugins/payment.html#requestpayment

    主要流程如下:
    1、调用plus.payment.getChannels获取支付通道IAP,IAP支付通道的ID为“appleiap”
    2、调用ID为“appleiap”的PaymentChannel对象的requestOrder方法,向Appstore请求有效的商品详情。
    3、 调用plus.payment.request方法发起支付请求,传入statement的参数为JSON对象,可以设置如下参数
    productid String(必选)要支付的商品的标识(必须是调用requestOrder返回的有效的商品标识)
    username String(可选)购买商品用户的用户名
    quantity String (可选)购买商品的数量,如果不填写默认为1
    调用后端接口校验订单信息

    3.1获取支付通道:
    3.2通过productid获取对应商品信息

    1、创建App内购项目,设置好税务和银行卡等配置信息

    登录iTunes Connect https://appstoreconnect.apple.com/ 应用后台, 可参考 https://help.apple.com/app-store-connect/#/devb57be10e7以及 详细设置过程: http://wap.qianfanyun.com/help/990
    在这里插入图片描述在这里插入图片描述

    2、HbuilderX 勾选Apple应用内支付

    在这里插入图片描述

    	export default {
    		data() {
    			return {
    				iap: null, // 支付通道
    				ids: ['day', 'quarter', 'year'], // 应用内购项目产品 ID 数组
    				product_list: [], // 应用内购项目列表
    				list_index: -1,// 商品列表选中的下标
    				vipRuleList: [] //显示的可购买项目列表
    			}
    		},
    		methods: {
    			// 获取支付通道
    			getChannels() {
    				// #ifdef APP-PLUS
    				plus.payment.getChannels(res => {
    					self.pay_type = 'appleiap'
    					let channel = res.find(i => i.id === 'appleiap')
    					console.log("channel" + channel)
    					this.iap = channel ? channel : null
    					this.requestOrder()
    				}, function(e) {
    					plus.nativeUI.alert("获取支付通道失败,请稍后重试。", function() {}, "提示");
    				})
    				// #endif
    			},
    			// 获取内购项目列表
    			requestOrder() {
    				uni.showLoading({
    					title: '检测支付环境...'
    				})
    				// #ifdef APP-PLUS
    				this.vipRuleList = []
    				this.iap.requestOrder(
    					this.ids,
    					res => {
    						uni.hideLoading()
                              this.vipRuleList=res
    					},
    					(errormsg) => {
    						uni.hideLoading()
    						plus.nativeUI.alert("获取应用内购项目失败,请稍后重试。", function(e) {}, "提示");
    						console.log(JSON.stringify(errormsg))
    
    					}
    				)
    				// #endif
    			},
    			 
    			/* ios内购 */
    			requestPayment(order_id) {
    				uni.showLoading({
    					title: '支付中请勿关闭...'
    				})
    				uni.requestPayment({
    					provider: 'appleiap',
    					orderInfo: {
    						productid: this.ids[this.list_index],
    					   username: self.userInfo.id +"-"+ order_id //透传参数,一般用于标记订单和用户的关系,向苹果服务器二次验证票据时返回此字段
    					},
    					success: (e) => {
    						console.log(e, '支付成功');
    						uni.hideLoading()
    						if (e.errMsg == 'requestPayment:ok') {
    							//在此处请求开发者服务器,在服务器端请求苹果服务器验证票据
    							self.validatePaymentResult({
    								order_id,
    								transactionIdentifier: e.transactionIdentifier,//交易唯一标识
    								receipt_data: e.transactionReceipt
    							})
    
    						}
    					},
    					fail: (e) => {
    						uni.hideLoading()
    						console.log(e);
    						uni.showModal({
    							content: "支付失败,原因为: " + e.errMsg,
    							showCancel: false
    						})
    					},
    					complete: () => {
    						uni.hideLoading()
    						console.log("payment结束")
    						this.loading = false;
    					}
    				})
    			},
    			async createIosOrder(list) {
    				var info = self.vipRuleList[self.list_index];
    			 	uni.showModal({
    					content:"列表"+JSON.stringify(self.vipRuleList)+"-info"+JSON.stringify(info)+"-list_index"+(self.list_index==-1),
    					showCancel: false
    				})  
    				/* if (self.list_index==-1) {
    					return uni.$u.toast('请选择充值类型');
    				} */
    				if (!self.pay_type) {
    					return uni.$u.toast('请选择支付方式')
    				}
    				uni.showLoading({})
    				const res = await createIosOrder({
    					price: info.price,
    					vip_rule_id: info.id,
    					pay_type: self.pay_type
    				})
    				this.requestPayment(res.orderInfo.order_id)
    
    			},
    			async validatePaymentResult(param) {
    				const res = await validatePaymentResult(param)
    				uni.showModal({
    					content: "支付成功",
    					showCancel: false
    				})
    			},
    			 
    			   
    		},
    		 
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
  • 相关阅读:
    jmeter之连接MySQL数据库
    HPC、AI与云计算:当智能时代三叉戟在亚马逊云科技完美融合
    软件设计不是CRUD(7):低耦合模块设计实战——组织机构模块(中)
    [附源码]java毕业设计疫情防控下高校教职工健康信息管理系统
    泰山OFFICE技术讲座:同一行不同字号的字如何对齐绘制
    (二十七)张量表示定理 —— Cauchy 基本表示定理
    互联网获客经验分享(一)
    JAVA毕业设计html5大众汽车网站计算机源码+lw文档+系统+调试部署+数据库
    网络靶场实战-物联网安全qiling框架初探
    UiPath实战(08) - 选取器(Selector)
  • 原文地址:https://blog.csdn.net/weixin_37391237/article/details/126409915