vipBuy.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. <template>
  2. <!-- <page-meta :page-style="pageStyle"></page-meta> -->
  3. <view class="content">
  4. <es-nav-bg-black title="中康未来会员" right="管理订阅"></es-nav-bg-black>
  5. <view class="es-fx es-pc es-h-168 es-ml-44 es-mr-44 es-mt-20">
  6. <image class="topBg" src="../../static/image/course/vipBuy/topbg.png"></image>
  7. <view class="topItem es es-fx x-f">
  8. <image class="es-w-104 es-h-56" style="position: absolute;left:-32rpx;top:0" src="../../static/image/course/xiangyun.png"></image>
  9. <view class="es-fs-40 es-h-156 es-fw-bold x-c" style="color: #FFDAA3;">
  10. <view class="es x-bc " style="margin-left: 90rpx;">
  11. <image class="es-w-120 es-h-120 es-br-ban" :src="!$isEmpty(user.avatar)?user.avatar:avatar" ></image>
  12. <view class="y-b es-ml-20">
  13. <view class="es-fw-bold es-fs-32 es es-ac" :class="user.isVip==1?'vipC':'es-c-white'" >
  14. {{ $isEmpty(user.nickName)?"暂无昵称":user.nickName }}
  15. <image v-if="user.isVip==1" @tap="loginNavTo('../course/vipBuy')" class="es-w-40 es-h-40 es-ml-10" src="../../static/image/mine/vip.png"></image>
  16. </view>
  17. <view v-if="user.isVip==1" class="es-fs-22 es-mt-10 es-c-white" style="color: #929A9D">有效期至:{{ $formatDate(user.vipEndDate) }}</view>
  18. <view v-else class="es-fs-26 es-c-white">开通VIP享<span class="es-fw-bold es-fs-44" style="color: #929A9D;">6</span>大特权</view>
  19. </view>
  20. </view>
  21. </view>
  22. <image class="es-w-104 es-h-56" style="position: absolute;right:-32rpx;bottom:30rpx" src="../../static/image/course/xiangyun2.png"></image>
  23. </view>
  24. </view>
  25. <!-- Vip选项 -->
  26. <scroll-view class="payBox es x-f es-ml-44 es-mt-40" scroll-x="true" >
  27. <view v-for="(item, index) in dataList" :key="index" @tap="changePackage(index)" class="payItem es-ac es-pc" :class="pickIndex==index?'ac':''">
  28. <image v-if="pickIndex==index" class="san" src="../../static/image/course/vipBuy/item_san.png"></image>
  29. <view class="es-fs-28 es-c-white es-fw-400 x-c" style="margin-top: 54rpx;">{{item.packageName}}</view>
  30. <view class="es-c-white es-fs-44 es-fw-500 es-mt-2 x-c-28 price x-c">¥{{item.sellPrice}}</view>
  31. <view class="es-fs-24 es-fw-400 oriPriceBox x-c">
  32. <view>原价</view>
  33. <view class="oriPrice">¥{{item.price}}
  34. <view class="zkline"></view>
  35. </view>
  36. </view>
  37. <view class="es es-h-44 es-bc-theme es-c-white es-br-9 es-fs-28 x-c es-fx es-ml-33 es-mr-33 es-mt-10" >限时优惠</view>
  38. </view>
  39. </scroll-view>
  40. <!-- 支付方式 -->
  41. <view class="es-mr-44 es-ml-44 es-mt-40" v-if="!isIos">
  42. <view class="es-c-white es-fs-40 es-fw-700">支付方式</view>
  43. <view class="es-mt-30 x-bc">
  44. <view v-for="(item, index) in payTypes" :key="index" @tap="changePayType(index)" class="payTypeItem es x-bc " :class="payType==index+1?'pt_ac':''">
  45. <view class="x-bc es-ml-14">
  46. <image class="es-w-59 es-h-52" :src="index==0?'../../static/image/course/vipBuy/wx.png':'../../static/image/course/vipBuy/zfb.png'"></image>
  47. <view class="es-fs-33 es-c-white es-fw-500 es-ml-14">{{item}}</view>
  48. </view>
  49. <image v-if="payType==index+1" src="../../static/image/course/vipBuy/check.png" class="es-w-40 es-h-40 es-br-ban es-mr-14"></image>
  50. <view v-else class="es-w-40 es-h-40 es-br-ban es-mr-14 circle"></view>
  51. </view>
  52. </view>
  53. </view>
  54. <view class="checkbox">
  55. <view class="checkbox-icon" @tap="handleAgree">
  56. <image src="../../static/image/login/radio_default.png" v-show="!agree"></image>
  57. <image src="../../static/image/login/radio_choose.png" v-show="agree"></image>
  58. </view>
  59. <view>开通前请阅读并同意<text @tap="openH5(0)">《会员服务协议》</text><text @tap="openH5(1)">《自动续费协议》</text></view>
  60. </view>
  61. <!-- 购买须知 -->
  62. <view class="es-mr-44 es-ml-44 es-mt-40">
  63. <view class="es-c-white es-fs-40 es-fw-700">购买须知</view>
  64. <view class="es-mt-24 es-c-white es-fs-28" style="line-height: 40rpx;">1.有效期内,会员内容都可使用 <br/> 2.中康未来会员为虛拟服务,开通后不支持退款<br/> 3.支付成功会员权益自动生效<br/></view>
  65. </view>
  66. <!-- 底部bottom -->
  67. <view class="es payBot x-bc">
  68. <view class="es-fs-56 es-fw-bold x-bc es-ml-44" style="color: #FDD8A1;">¥{{checkPrice}} <view class="tehui">(限时优惠)</view></view>
  69. <view class="es btnPay x-c" @tap="doBuy">立即开通</view>
  70. </view>
  71. <uni-popup ref="popTip" type="dialog">
  72. <uni-popup-dialog cancelText="支付失败" confirmText="支付成功" mode="base" content="是否已支付成功?" title="提示" :duration="2000" :before-close="true" @close="confirmTip" @confirm="confirmTip"></uni-popup-dialog>
  73. </uni-popup>
  74. </view>
  75. </template>
  76. <script>
  77. import {getIOSPayStatus} from '@/api/common.js';
  78. import {getUserInfo} from '@/api/user'
  79. import { getPackageList,createVipOrder,vipZfbPayment,getVipOrderById,applePayment,setIapCertificate } from '@/api/course'
  80. export default {
  81. data() {
  82. return {
  83. dataList:[],
  84. pickIndex:0,
  85. packageItem:{sellPrice:0,price:0},
  86. checkPrice:0.0,
  87. payTypes:["微信支付","支付宝支付"],
  88. payType:1,//微信支付:1 支付宝支付:2
  89. user:{
  90. avatar:"/static/images/detault_head.png",
  91. userName:"",
  92. phone:"",
  93. nickName:"",
  94. },
  95. order:null,
  96. showPayTips:false,
  97. agree: false,
  98. isAgreePrivacy:false,
  99. isIos: false,
  100. showIOSPay: 0,
  101. isCanPay: true,
  102. iapChannel: null,
  103. restoreFlag: false,
  104. appleProductId: ''
  105. }
  106. },
  107. // onBackPress() {
  108. // // 手动调用返回方法
  109. // uni.navigateBack({ delta: 1});
  110. // // 阻止默认的返回行为
  111. // return true;
  112. // },
  113. onLoad(options) {
  114. // #ifdef APP-PLUS
  115. this.isIos = plus.os.name == "iOS"
  116. if (this.isIos) {
  117. this.getIOSPayStatusFun()
  118. } else {
  119. this.isAgreePrivacy=plus.runtime.isAgreePrivacy();
  120. }
  121. // #endif
  122. this.initData();
  123. },
  124. onShow() {
  125. if(this.showPayTips){
  126. this.$refs.popTip.open();
  127. this.showPayTips=false;
  128. }
  129. this.restoreComplateRequest()
  130. },
  131. onUnload() {
  132. const subNVue = uni.getSubNVueById('privilege');
  133. if(subNVue){
  134. setTimeout(e => {
  135. subNVue.show();
  136. }, 200);
  137. }
  138. },
  139. methods: {
  140. getIOSPayStatusFun() {
  141. getIOSPayStatus().then(res => {
  142. if (res.code == 200) {
  143. this.showIOSPay = res.iosPayStatus
  144. }
  145. })
  146. },
  147. initData(){
  148. this.getPackageList();
  149. this.getUserInfo();
  150. },
  151. getPackageList(){
  152. getPackageList().then(res => {
  153. if(res.code==200){
  154. this.dataList=res.data;
  155. this.packageItem=this.dataList[0];
  156. this.checkPrice=this.packageItem.sellPrice;
  157. this.appleProductId = this.packageItem.appleProductId
  158. }
  159. },
  160. rej => {}
  161. );
  162. },
  163. doBuy(){
  164. this.createVipOrder();
  165. },
  166. createVipOrder(){
  167. if (!this.agree) {
  168. uni.showToast({
  169. title: "请同意相关协议",
  170. icon: 'none'
  171. });
  172. return
  173. }
  174. if(!this.$isLogin()){
  175. this.$showLoginPage();
  176. return;
  177. }
  178. if(this.isIos&&this.showIOSPay != 1) {
  179. uni.showToast({
  180. title: '请开通苹果支付',
  181. icon: 'none'
  182. });
  183. return
  184. }
  185. if(this.isIos&&this.showIOSPay==1) {
  186. this.payType = 2
  187. }
  188. uni.showLoading({title:""});
  189. let params={"packageId":this.packageItem.packageId,"payType":this.payType};
  190. createVipOrder(params).then(res => {
  191. console.log("qxj createVipOrder res:"+JSON.stringify(res));
  192. uni.hideLoading();
  193. if(res.code==200){
  194. this.order=res.order;
  195. if(this.payType==1){ //微信支付
  196. this.doWxPay();
  197. } else if (this.payType == 2) { //苹果
  198. this.doApplePay()
  199. } else{ //支付宝
  200. this.doAlipay();
  201. }
  202. }else{
  203. uni.showToast({title: res.msg,icon: 'none'});
  204. }
  205. },
  206. rej => {}
  207. );
  208. },
  209. changePackage(index){
  210. this.pickIndex=index;
  211. this.packageItem=this.dataList[index];
  212. this.checkPrice=this.packageItem.sellPrice;
  213. this.appleProductId = this.packageItem.appleProductId
  214. },
  215. changePayType(index){
  216. this.payType=index+1;
  217. },
  218. getUserInfo(){
  219. let that=this;
  220. getUserInfo().then(res => {
  221. if(res.code==200){
  222. if(res.user!=null){
  223. uni.setStorageSync('userInfo',JSON.stringify(res.user));
  224. this.user=res.user;
  225. }
  226. else{
  227. uni.showToast({
  228. icon:'none',
  229. title: res.msg,
  230. });
  231. }
  232. }
  233. },
  234. rej => {}
  235. );
  236. },
  237. doAlipay(){
  238. var data = {orderId:this.order.orderId};
  239. let that=this;
  240. // #ifdef APP-PLUS
  241. const tzCashier=uni.requireNativePlugin("TZBank-Cashier");
  242. uni.showLoading();
  243. vipZfbPayment(data).then(res => {
  244. uni.hideLoading();
  245. if(res.code==200){
  246. if(res.type=="tz"){
  247. //console.log("qxj res:"+JSON.stringify(res));
  248. //console.log("qxj orderFlowNo:"+res.data.body.orderFlowNo+" businessCstNo:"+res.data.body.orderNo+" platMerCstNo:"+res.data.body.platMerCstNo);
  249. const match = res.data.body.url.match(/[\?&]businessCstNo=([^&]+)/);
  250. const businessCstNo = match ? match[1] : null;
  251. console.log("qxj tzCashier:"+tzCashier+" businessCstNo:"+businessCstNo);
  252. tzCashier.pay({
  253. env:0,
  254. wxMiniProgramType:0,
  255. wxAppId:'wx703c4bd07bbd1695',
  256. wxUniversalLink:"https://yjf.runtzh.com/",
  257. orderFlowNo:res.data.body.orderFlowNo,
  258. businessCstNo:businessCstNo,
  259. platMerCstNo:res.data.body.platMerCstNo
  260. },(res)=>{
  261. // uni.showToast({
  262. // title:'收银台回调:'+JSON.stringify(res),
  263. // icon:'none'
  264. // });
  265. uni.$emit('closePrivilege', {});
  266. that.showPayTips=true;
  267. });
  268. }
  269. else if(res.type=='hf'){
  270. if (uni.getSystemInfoSync().platform == 'android') {
  271. var alipayScheme ='alipays://platformapi/startApp?&saId=10000007&qrcode=' + res.data.qr_code;
  272. }else{
  273. var alipayScheme ='alipay://platformapi/startApp?&saId=10000007&qrcode=' + res.data.qr_code;
  274. }
  275. // 在uni-app中使用plus.runtime.openURL打开URL
  276. plus.runtime.openURL(alipayScheme, function(error) {
  277. });
  278. uni.$emit('closePrivilege', {});
  279. that.showPayTips=true;
  280. }
  281. }
  282. else{
  283. uni.showToast({title:res.msg,icon:'none'})
  284. }
  285. },
  286. rej => {}
  287. );
  288. // #endif
  289. },
  290. doWxPay(){
  291. var that=this;
  292. plus.share.getServices(function(res){
  293. var sweixin = null;
  294. for(var i=0;i<res.length;i++){
  295. var t = res[i];
  296. if(t.id == 'weixin'){
  297. sweixin = t;
  298. }
  299. }
  300. if(sweixin){
  301. let path='/pages_order/userVipOrderPayment?orderId='+that.order.orderId+"&payMethod=app";
  302. console.log('调起小程序 path:'+path);
  303. //唤起微信跳转小程序
  304. sweixin.launchMiniProgram({
  305. id:getApp().globalData.miniprogamId,
  306. path:'/pages_order/userVipOrderPayment?orderId='+that.order.orderId+"&payMethod=app",
  307. type:0 // 微信小程序版本类型,可取值: 0-正式版; 1-测试版; 2-体验版。 默认值为0。
  308. },function(){
  309. console.log("微信唤起成功");
  310. return true;
  311. },function(e){
  312. console.log("微信唤起失败",e);
  313. uni.showToast({
  314. title:'微信唤起失败,请检查是否有微信应用',
  315. icon:'none'
  316. });
  317. return false;
  318. });
  319. that.showPayTips=true;
  320. uni.$emit('closePrivilege', {});
  321. }else{
  322. uni.showToast({
  323. title:'微信唤起失败,请检查是否有微信应用',
  324. icon:'none',
  325. duration:3000
  326. });
  327. return false;
  328. }
  329. },function(res){
  330. console.log(JSON.stringify(res));
  331. });
  332. },
  333. getVipOrderById(){
  334. getVipOrderById(this.order.orderId).then(res => {
  335. this.$refs.popTip.close();
  336. if(res.code==200){
  337. if(res.data.status==1 || res.data.payTime!=null){
  338. // #ifdef APP-PLUS
  339. if(plus.runtime.channel=="baidu"){ //获取渠道标识
  340. let bdCmdType=uni.getStorageSync("bdCmdType");
  341. if(bdCmdType!=null && parseInt(bdCmdType)<=2){
  342. //this.$registerIdCode("orders",2,res.data.payMoney.toString()); //已下单
  343. }
  344. }
  345. // #endif
  346. this.getUserInfo();
  347. uni.showToast({title:"支付成功",icon:'success'});
  348. }else{
  349. uni.showToast({title:"支付失败",icon:'error'});
  350. }
  351. }
  352. setTimeout(()=>{
  353. this.$navBack();
  354. },2000);
  355. },
  356. rej => {}
  357. );
  358. },
  359. openH5(index){
  360. uni.setStorageSync('url',index==0?"https://userapp.zkhj6.com/web/userAgreement":"https://userapp.zkhj6.com/web/vipAutomaticService");
  361. uni.navigateTo({
  362. url:"/pages/index/h5"
  363. })
  364. },
  365. closeTip(){
  366. this.$refs.popTip.close();
  367. this.getVipOrderById();
  368. },
  369. confirmTip() {
  370. uni.showLoading({title:"请稍侯...",mask:true});
  371. setTimeout(()=>{
  372. uni.hideLoading();
  373. this.getVipOrderById();
  374. uni.$emit('refreshUser', {});
  375. },2000);
  376. // setTimeout(()=>{
  377. // this.$navBack();
  378. // },2000);
  379. },
  380. handleAgree() { // 同意
  381. this.agree = !this.agree
  382. if(this.isIos) {
  383. if(this.agree) {
  384. plus.runtime.agreePrivacy()
  385. } else {
  386. plus.runtime.disagreePrivacy();
  387. }
  388. }
  389. },
  390. doApplePay(){
  391. var data = {
  392. orderId: this.order.orderId
  393. };
  394. let that = this;
  395. uni.showLoading({
  396. title: ""
  397. });
  398. applePayment(data).then(res => {
  399. uni.hideLoading();
  400. console.log("applePayment===",res)
  401. if (res.code == 200) {
  402. this.checkApplePay(res.payCode)
  403. } else {
  404. uni.showLoading({
  405. title: res.msg,
  406. icon: none
  407. })
  408. }
  409. }).catch(err => {
  410. uni.hideLoading();
  411. })
  412. },
  413. checkApplePay(payCode) {
  414. const that = this
  415. uni.showLoading({
  416. title: '检测支付环境...',
  417. mask: true
  418. })
  419. uni.getProvider({
  420. service: 'payment',
  421. success: (res) => {
  422. let iapChannel = res.providers.find((channel) => channel.id === 'appleiap');
  423. that.iapChannel = iapChannel
  424. if (!iapChannel) {
  425. console.log('Apple IAP channel not found. Check device & configuration.');
  426. uni.hideLoading()
  427. uni.showToast({
  428. title: "不支持苹果支付",
  429. icon: 'none'
  430. })
  431. return;
  432. }
  433. console.log("that.appleProductId=====",that.appleProductId)
  434. // 获取订单信息,必须调用此方法才能进行 iap 支付
  435. iapChannel.requestOrder([that.appleProductId], function(orderList) {
  436. console.log('requestOrder success666: ', orderList)
  437. that.applePay(payCode)
  438. }, function(e) {
  439. uni.showToast({
  440. title: "获取产品信息失败",
  441. icon: 'none'
  442. })
  443. console.log('requestOrder failed: ' + JSON.stringify(e));
  444. })
  445. },
  446. fail: (err) => {
  447. console.log('Failed to get payment provider:', err);
  448. uni.hideLoading()
  449. uni.showToast({
  450. title: "获取支付通道失败",
  451. icon: 'none'
  452. })
  453. }
  454. });
  455. },
  456. // 请求是否有已完成未关闭的订单
  457. restoreComplateRequest() {
  458. const that = this
  459. if (this.iapChannel) {
  460. this.iapChannel.restoreComplateRequest({
  461. manualFinishTransaction: true, // 3.5.1+ 支持,设置此参数后需要开发者主动关闭订单,参见下面的关闭订单方法 finishTransaction()
  462. username: "USERID_"+ that.user.userId
  463. }, function(res) {
  464. // res 格式为数组存放恢复的IAP商品交易信息对象 IAPTransaction,需要将返回的支付凭证传给后端进行二次认证
  465. //如果有并且状态为已支付则请求关闭并回调给后端
  466. console.log("已完成未关闭的订单信息:", res)
  467. if (res.length > 0) {
  468. //轮询关闭订单
  469. res.map(item => {
  470. that.finishTransaction(item, that.iapChannel)
  471. })
  472. }
  473. });
  474. }
  475. },
  476. // 关闭订单
  477. finishTransaction(transaction, iapChannel) {
  478. console.log("==finishTransaction===")
  479. return new Promise((resolve, reject) => {
  480. this.iapChannel.finishTransaction(transaction, (res) => {
  481. console.log("==fresolve inishTransaction===",res)
  482. resolve(res);
  483. }, (err) => {
  484. console.log("==err inishTransaction===",err)
  485. reject(err);
  486. });
  487. });
  488. },
  489. //苹果支付
  490. applePay(payCode) {
  491. console.log("苹果支付", this.order.orderId,payCode)
  492. let that = this
  493. uni.showLoading({
  494. title: '支付中...',
  495. mask: true
  496. })
  497. this.restoreFlag = true
  498. uni.requestPayment({
  499. provider: 'appleiap',
  500. orderInfo: {
  501. productid: that.appleProductId,
  502. username: 'USERID_' + this.user.userId, // 透传参数,一般用于标记订单和用户的关系,向苹果服务器二次验证票据时返回此字段
  503. quantity: 1, // 购买数量,至少大于等于 1
  504. manualFinishTransaction: true,
  505. optimize: true // 设置 optimize: true 解决丢单问题
  506. },
  507. async success(res) {
  508. console.log("苹果支付===", res)
  509. that.restoreFlag = false
  510. // {
  511. // "payment": {
  512. // "productid": "001",
  513. // "quantity": "1",
  514. // "username": "ORDERID562"
  515. // },
  516. // "transactionDate": "2025-07-02 18:20:37",
  517. // "transactionIdentifier": "2000000953130653",
  518. // "transactionReceipt": "MIIUQAYJKoZIhvcNAQcCoIIUMTCCFC0CAQExDzANBglghkgBZQMEAgEFADCCA3YGCSqGSIb3DQEHAaCCA2cEggNjMYIDXzAKAgEIAgEBBAIWADAKAgEUAgEBBAIMADALAgEBAgEBBAMCAQAwCwIBCwIBAQQDAgEAMAsCAQ8CAQEEAwIBADALAgEQAgEBBAMCAQAwCwIBGQIBAQQDAgEDMAwCAQoCAQEEBBYCNCswDAIBDgIBAQQEAgIAvTANAgENAgEBBAUCAwLBFDANAgETAgEBBAUMAzEuMDAOAgEDAgEBBAYMBDE1ODMwDgIBCQIBAQQGAgRQMzA1MBgCAQQCAQIEEIn2zMlMT4RnwdczmAzhxI0wGgIBAgIBAQQSDBBjb20ubXl0ZWsucnRsaXZlMBsCAQACAQEEEwwRUHJvZHVjdGlvblNhbmRib3gwHAIBBQIBAQQU6+HC7v4yocHw4AKgAc8nU0EjGncwHgIBDAIBAQQWFhQyMDI1LTA3LTAyVDEwOjIwOjM4WjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMEECAQcCAQEEOf/TAfmTNflqfG+0yxJoXWUWPtPk40UmHkezkM6Tby9tiEY82zITHOh/8/nYrrJbrMtXx9jR6RQPTjBcAgEGAgEBBFSiQX4cZ7D1J0tgWggfSiROLeygpukI+T9p3swfyX6O0O+b1iYlHk2tZA6mC1qhv+d/ukhH09ndSgGV9KMmt6XnYnk9z5tyJAemkc8feKUWMb1O4SowggFWAgERAgEBBIIBTDGCAUgwCwICBqwCAQEEAhYAMAsCAgatAgEBBAIMADALAgIGsAIBAQQCFgAwCwICBrICAQEEAgwAMAsCAgazAgEBBAIMADALAgIGtAIBAQQCDAAwCwICBrUCAQEEAgwAMAsCAga2AgEBBAIMADAMAgIGpQIBAQQDAgEBMAwCAgarAgEBBAMCAQAwDAICBq4CAQEEAwIBADAMAgIGrwIBAQQDAgEAMAwCAgaxAgEBBAMCAQAwDAICBroCAQEEAwIBADAOAgIGpgIBAQQFDAMwMDEwGwICBqcCAQEEEgwQMjAwMDAwMDk1MzEzMDY1MzAbAgIGqQIBAQQSDBAyMDAwMDAwOTUzMTMwNjUzMB8CAgaoAgEBBBYWFDIwMjUtMDctMDJUMTA6MjA6MzdaMB8CAgaqAgEBBBYWFDIwMjUtMDctMDJUMTA6MjA6MzdaoIIO4jCCBcYwggSuoAMCAQICEH05IAlOvvP478psEOqOQwMwDQYJKoZIhvcNAQELBQAwdTFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxCzAJBgNVBAsMAkc1MRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzAeFw0yNDA3MjQxNDUwMDNaFw0yNjA4MjMxNDUwMDJaMIGJMTcwNQYDVQQDDC5NYWMgQXBwIFN0b3JlIGFuZCBpVHVuZXMgU3RvcmUgUmVjZWlwdCBTaWduaW5nMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDzabzzfagXFb1vEU/BnT9dTwN01cRsKaKUdRYb6xP5hZ7BwXuq+zCVcFRNcXbV3SMMK7M6HUifR2OVZXLTU/Tal4gtFaYdZ7sC6VVPAHv2DkKaQzPUevdo9dA5uaOAohzN8Ul4fUHWHKKo3EPlWufJ1iALAKGDm45h2N86Qw8ZSTY9sT6TyOKf3ViHOzFJhvc8niM9Un9rbjddbqzqvf4vgMvlmK7XB6rpIF2UwHIOVtTEh00D7+YHcBeT4TO3+FAM+Vf4JdlCA065J1tQZB+5+ZlyS677rYmUr0dy552Djeo9gvRVBE5DMimdX35ZyE+cYEEcvgVeE0yxWyIxWlAgMBAAGjggI7MIICNzAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFBmLl41KW2F4V/SlXDUSijkI47B1MHAGCCsGAQUFBwEBBGQwYjAtBggrBgEFBQcwAoYhaHR0cDovL2NlcnRzLmFwcGxlLmNvbS93d2RyZzUuZGVyMDEGCCsGAQUFBzABhiVodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDAzLXd3ZHJnNTA1MIIBHwYDVR0gBIIBFjCCARIwggEOBgoqhkiG92NkBQYBMIH/MDcGCCsGAQUFBwIBFitodHRwczovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNhdGVhdXRob3JpdHkvMIHDBggrBgEFBQcCAjCBtgyBs1JlbGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDAGA1UdHwQpMCcwJaAjoCGGH2h0dHA6Ly9jcmwuYXBwbGUuY29tL3d3ZHJnNS5jcmwwHQYDVR0OBBYEFO8oV7RgiElVMfD9WA7x/RqTxCT8MA4GA1UdDwEB/wQEAwIHgDAQBgoqhkiG92NkBgsBBAIFADANBgkqhkiG9w0BAQsFAAOCAQEANSPSu1C/NmfMADVEfIqTp8Ren7lE6nJHzxCGuhztCnUeWTB1hcoidYlCC+GccOU+pTx6kPg/EqxzTCRYmS7fgfEPJaYOpTBOpeawzVN7RUuw5ls6MNa09CtSog9P1hMjgjPmLYWRUHwx1EhxlPoIle6dAGYaueaJDI6xiX0WSrCIFR0UKYcUHTH6rmoA8j2RY1uAgkgePkrTAt2GXc1y4jc8qAslu2Paqz8xZagnG/A7U0UdEn5GH8WsH8hznJj4NLBgfe7zEQxWlj4JBOft5B5HWbDwgzcu+xzHE6Npcuu9mCaQhI9uTfxoKftNbhjt3K2qucRpmBQI/flL+2z+mTCCBFUwggM9oAMCAQICFDt+gAru0wKh5uzbl9nKrCic8WmUMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTAeFw0yMDEyMTYxOTM4NTZaFw0zMDEyMTAwMDAwMDBaMHUxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQswCQYDVQQLDAJHNTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCfXdof+/q80EsiPMfWJvoX9/SfHj5kEWaa716+qzS9qiwhbtYelCGFLHTBDhBhqjxjSn5K48h11s/CnAhIe2q5KbHJZv3IihbRsgQ8grqAbOL/CnLrrP47b0i+nosRTZV9snuQLwIcTvxJvtdvtU++eMba3rLNydlmETta6QlFc4lQ1E7iaAV+2nWcSwGu2uPPbXRN3lPQ1Ro4gjrQneNdKXuxgeopJwv7YHyGEvvwYk8G50zRH9ltnu1z2nghDZ1w2UZXkF9nhMFzdwqoYmK2rnCGu3Ujia159uak1P2DJjIKOySSWyChnNEvgBib3TwL57X97IBXDxeePyuHJ7v3AgMBAAGjge8wgewwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBQr0GlHlHYJ/vRrjS5ApvdHTX8IXjBEBggrBgEFBQcBAQQ4MDYwNAYIKwYBBQUHMAGGKGh0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtYXBwbGVyb290Y2EwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5jcmwwHQYDVR0OBBYEFBmLl41KW2F4V/SlXDUSijkI47B1MA4GA1UdDwEB/wQEAwIBBjAQBgoqhkiG92NkBgIBBAIFADANBgkqhkiG9w0BAQsFAAOCAQEAWsQ1otnmCp5SogCCInfNci+Q+SKvFCXMqgpCYJLCvXUd60zKFeV+a0AQXvtbRXQN8Hp9iJHO3mOLQonSGN9Bs1ieBgiHSN1AryPV7essYOXrpH8c6ZyD1pRfTGI5ik6uE419Q7jcXqy+GEDy5g8sXROT8XtlqMJoSN7/tJabDPsyNp6eDZVfOAqLltISbLeLC47XPuxvAarOTUVg24RxZmLlGWUwzYr/RVP7bvuId0PDSGP591Gzcl554lbPvLuEuThaeK4RSFK7DTWLlN7MdJpo9UlglKzyqLMVhpDQzDBDhtPlcAJRtIHAqJfU6uqwjAlA7ziTss0iA+tnQ2XIRTCCBLswggOjoAMCAQICAQIwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5JGpCR+R2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQCdN/QaiY+dHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm/IlA7pVj01dDfFkNSMVSxVZHbOU9/acns9QusFYUGePCLQg98usLCBvcLY/ATCMt0PPD5098ytJKBrI/s61uQ7ZXhzWyz21Oq30Dw4AkguxIRYudNU8DdtiFqujcZJHU1XBry9Bs/j743DN5qNMRX4fTGtQlkGJxHRiCxCDQYczioGxMFjsWgQyjGizjx3eZXP/Z15lvEnYdp8zFGWhd5TJLQIDAQABo4IBejCCAXYwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn+9GuNLkCm90dNfwheMB8GA1UdIwQYMBaAFCvQaUeUdgn+9GuNLkCm90dNfwheMIIBEQYDVR0gBIIBCDCCAQQwggEABgkqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBsZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBgkqhkiG9w0BAQUFAAOCAQEAXDaZTC14t+2Mm9zzd5vydtJ3ME/BH4WDhRuZPUc38qmbQI4s1LGQEti+9HOb7tJkD8t5TzTYoj75eP9ryAfsfTmDi1Mg0zjEsb+aTwpr/yv8WacFCXwXQFYRHnTTt4sjO0ej1W8k4uvRt3DfD0XhJ8rxbXjt57UXF6jcfiI1yiXV2Q/Wa9SiJCMR96Gsj3OBYMYbWwkvkrL4REjwYDieFfU9JmcgijNq9w2Cz97roy/5U2pbZMBjM3f3OgcsVuvaDyEO2rpzGU+12TZ/wYdV2aeZuTJC+9jVcZ5+oVK3G72TQiQSKscPHbZNnF5jyEuAF1CqitXa5PzQCQc3sHV1ITGCAbUwggGxAgEBMIGJMHUxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQswCQYDVQQLDAJHNTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMCEH05IAlOvvP478psEOqOQwMwDQYJYIZIAWUDBAIBBQAwDQYJKoZIhvcNAQEBBQAEggEAWDSs6G33VDsmIePU1Fp0rTsuxzbh8rURBw43eNc3yUmS/zOm8XTld7atU7L5tV36LrGm03q+YiHV6Rc3BwU3SkinAddgLzGCJwaJe36Lbbp6sz39wpI8ecoBtyLwI7jr+J2b2PU0M264ciuWel7wcyQQWuhjmiwa333pg7mVxpWakJtS92X/tHn3LgZU7wnn21dz1QmlzJDMlEmKz9jn6ajyHI5IMc9uSh8OJBjGI10v9Et3w2vehLAngXTHC22DEhTA+FFIw9w907dH2/5FZwFT3HFXCNWVq8ec5fuJ/QKzOX0FAbpP5n0yAtom5VHK8o85/qc8oliAyJ/qggUNdg==",
  519. // "transactionState": "1",
  520. // "errMsg": "requestPayment:ok"
  521. // }
  522. if(res.transactionState == '1'){
  523. //调用后端接口验签
  524. let data = {
  525. payCode: payCode,
  526. transactionId: res.transactionIdentifier,
  527. receipt: res.transactionReceipt,
  528. chooseEnv: false, // 是否选择正式环境
  529. payclassifyId: that.appleProductId,
  530. classify: 5, // 5:appvip,course
  531. }
  532. that.submitMisson(data,res)
  533. }
  534. },
  535. fail(e) {
  536. console.log('调起苹果支付失败:', e)
  537. that.isCanPay = true
  538. uni.showLoading({
  539. title: '支付失败',
  540. icon: "error"
  541. })
  542. },
  543. complete() {
  544. that.isCanPay = true
  545. uni.hideLoading()
  546. }
  547. })
  548. },
  549. // 苹果内购二次校验
  550. submitMisson(data,transaction) {
  551. const that = this
  552. uni.showLoading({
  553. title: '正在处理支付结果...',
  554. mask: true
  555. })
  556. setIapCertificate(data).then( async res => {
  557. uni.hideLoading()
  558. if (res.code == 200) {
  559. //给支付按钮解锁
  560. that.isCanPay = true
  561. console.log("submitMisson===",res)
  562. if (res.status == 1 || res.payTime != null) {
  563. // #ifdef APP-PLUS
  564. if (plus.runtime.channel == "baidu") { //获取渠道标识
  565. let bdCmdType = uni.getStorageSync("bdCmdType");
  566. if (bdCmdType != null && parseInt(bdCmdType) <= 2) {
  567. //this.$registerIdCode("orders",2,res.data.payMoney.toString()); //已下单
  568. }
  569. }
  570. // #endif
  571. that.getUserInfo();
  572. await that.finishTransaction(transaction)
  573. uni.showToast({
  574. title: "支付成功",
  575. icon: 'success'
  576. });
  577. } else {
  578. uni.showToast({
  579. title: "支付失败",
  580. icon: 'error'
  581. });
  582. }
  583. }
  584. }).catch(()=>{
  585. uni.hideLoading()
  586. })
  587. }
  588. }
  589. }
  590. </script>
  591. <style >
  592. page {
  593. background-color: #1B1F22;
  594. }
  595. .topBg{
  596. position: absolute;
  597. width:calc(100% - 88rpx) ;
  598. height:168rpx;
  599. z-index: 5;
  600. }
  601. .topItem{
  602. width: 100%;
  603. height: 100%;
  604. z-index: 10;
  605. }
  606. .payBox{
  607. display:flex;
  608. white-space:nowrap;
  609. overflow-x: scroll;
  610. }
  611. .payItem{
  612. position: relative;
  613. display: inline-block;
  614. width: 209rpx;
  615. height: 286rpx;
  616. background-image: url(../../static/image/course/vipBuy/item.png);
  617. background-repeat: no-repeat;
  618. background-size: cover;
  619. background-position: center;
  620. /* background-attachment: fixed; */
  621. margin-right: 12rpx;
  622. }
  623. .ac{
  624. background-image: url(../../static/image/course/vipBuy/item_ac.png);
  625. .price{
  626. color: #C4AA83;
  627. }
  628. }
  629. .san{
  630. position: absolute;
  631. left: calc(50% - 25rpx);
  632. top:-10rpx;
  633. width: 50rpx;
  634. height: 42rpx;
  635. }
  636. .price{
  637. color: #fff;
  638. }
  639. .oriPriceBox{
  640. color: #797A7D;
  641. .oriPrice{
  642. position: relative;
  643. }
  644. .zkline{
  645. position: absolute;
  646. left: 0;
  647. top:18rpx;
  648. height: 1px;
  649. width: 100%;
  650. background-color:#797A7D ;
  651. }
  652. }
  653. .payTypeItem{
  654. background-color:#1B1F22;
  655. border:1px solid #fff;
  656. border-radius: 10rpx;
  657. width: calc(50% - 15rpx);
  658. height: 94rpx;
  659. }
  660. .circle{
  661. border:1px solid #fff;
  662. }
  663. .pt_ac{
  664. border:1px solid #FDD8A1;
  665. }
  666. .payBot{
  667. position: fixed;
  668. bottom: 0;
  669. left: 0;
  670. right: 0;
  671. width: 100%;
  672. height: 170rpx;
  673. }
  674. .tehui{
  675. color: #8B8F92;
  676. font-size: 26rpx;
  677. font-weight: 400;
  678. }
  679. .btnPay{
  680. width: 246rpx;
  681. height: 84rpx;
  682. background: linear-gradient(90deg, #FFE0B2, #F8BA8B);
  683. border-radius: 41rpx;
  684. margin-right: 44rpx;
  685. font-weight: 700;
  686. font-size: 40rpx;
  687. color: #1B1F22;
  688. line-height: 61rpx;
  689. }
  690. .vipC{
  691. color: #FDD8A1;
  692. }
  693. .checkbox {
  694. margin: 20rpx;
  695. margin-left: 20px;
  696. margin-top: 36rpx;
  697. display: flex;
  698. flex-direction:row;
  699. align-items: flex-start;
  700. justify-content: flex-start;
  701. font-family: PingFang SC, PingFang SC;
  702. font-weight: 400;
  703. font-size: 26rpx;
  704. color: #999999;
  705. line-height: 38rpx;
  706. text-align: left;
  707. }
  708. .checkbox text{
  709. color:#2583EB;
  710. }
  711. .checkbox-icon{
  712. flex-shrink: 0;
  713. margin-right: 12rpx;
  714. }
  715. .checkbox-icon image{
  716. height: 30rpx;
  717. width: 30rpx;
  718. margin-top: 2px;
  719. }
  720. </style>