微信小程序支付

微信小程序 - 支付功能 支付功能逻辑 1. 获取用户地址,通过 uni.chooseAddress 2. 获取支付需要的token 2.1 没有token的情况下,需要去到授权页面进行授权 3. 创建订单,获取订单的编号 4. 获取支付需要的参数 5. 调用支付接口 6. 查询支付状态 7. 支付成功后,删除本地已支付的购物小车中商品的数据 8. 跳转到订单页面 准备工作: 1. 检查AppID 2. 检查基本路径 base_url 3. 微信账号添加到 管理后台 微信支付流程 分析:说明小程序支付流程 微信支付 阅读详情

开发工具:idea,hbuildx,微信开发工具
微信小程序官方图片
在这里插入图片描述

实现支付操作思路及代码
一、登录
1.uni.login()方法获取用户凭证code
2.uni.getUserProfile()方法返回用的昵称,头像等信息,把用户的code,昵称,头像请求后端接口
3.,后端接口用code,appid,secret等封装成map请求微信获取openid的微信api获取用户的openid
4.查询数据库是否存在该openid,没有的话添加进去,然后根据用户ID生成token,把token和expire返回给小程序,存到storage中,小程序每次请求后端接口都要把token放到请求的header里面

//小程序代码

//login方法获取code,code5分钟有效
uni.login({
					provider:'weixin',
					success:function(res){
						let code = res.code;
						that.code = code;
						console.log("code=>>>"+code)
					}
				}),

//获取微信用户信息
uni.getUserProfile({
					desc:"获取登录用户的信息",
					success(res){
						console.log(res)
						let username = res.userInfo.nickName;
						let photo = res.userInfo.avatarUrl;
						console.log("username====>"+username);
						console.log("photo====>"+photo);
						that.username = username;
						that.photo =photo;
						//请求后台商户系统,返回用户token,存入storage,以后每次请求商户系统都要带有token
						uni.request({
							url:that.url.wxLogin,
							method:"POST",
							data:{
								"nickname":that.username,
								"photo":that.photo,
								"code":that.code,
							},
							success(res){
								let token = res.data.token;
								let expire = res.data.expire;
								console.log("token====>"+token)
								console.log("expire====>"+expire)
								uni.setStorageSync("token",token);
								uni.setStorageSync("expire",expire);
								uni.switchTab({
									url:"../index/index",
								})
							}
						})
					}
				})

//后端代码


@PostMapping("/login")
    @ApiOperation("登录")
    public R login(@RequestBody WxLoginForm form){
        //表单校验
        ValidatorUtils.validateEntity(form);
        Map<String, Object> map = new HashMap<>();
        map.put("appid", wxConfiguration.getAppId());
        map.put("secret", wxConfiguration.getAppSecret());
        map.put("js_code", form.getCode());
        map.put("grant_type", "authorization_code");
        String response = HttpUtil.post(wxConfiguration.getLoginUrl(), map);
        JSONObject jsonObject = JSONUtil.parseObj(response);
        String openid = jsonObject.getStr("openid");
        if (openid == null || StringUtils.isBlank(openid)) {
            return R.error("微信登录凭证不正确!");
        }
        LambdaQueryWrapper<UserEntity> ew = new LambdaQueryWrapper<>();
        ew.eq(UserEntity::getOpenId, openid);
        UserEntity userEntity = userService.getOne(ew);
        String token;
        if (userEntity == null) {
            UserEntity user = new UserEntity();
            user.setNickname(form.getNickname());
            user.setOpenId(openid);
            user.setPhoto(form.getPhoto());
            user.setCreateTime(new Date());
            user.setType(EnumUtil.WX.getCode());
            userService.save(user);
            token = jwtUtils.generateToken(user.getUserId());
        }else{
            token = jwtUtils.generateToken(userEntity.getUserId());
        }
        Map<String, Object> result = new HashMap<>();
        result.put("token", token);
        result.put("expire", jwtUtils.getExpire());
        return R.ok(result);
    }

二、支付
1.小程序带着订单id和用户token请求后端接口,后端先验证用户和订单的有效性,验证通过后封装参数,调用微信统一下单api获得支付订单的id

2.获得支付订单id后封装数据发送给小程序,小程序把数据发送给微信平台验证支付的正确性,如果正确就返回支付的二维码,支付成功之后调用success()函数,在success函数中可以调用后端接口让主动查询微信支付结果api,看该订单是否支付成功,支付订单支付成功的话就修改商品订单的状态为已付款

小程序代码


pay(id){
				let that = this;
				uni.request({
					url:that.url.mircoPayOrder,
					method:"POST",
					data:{
						"orderId":id,
					},
					header:{
						"token":uni.getStorageSync("token"),
					},
					success(res){
						console.log("pay-res=====>"+res.data);
						let timeStamp = res.data.timeStamp;
						let nonceStr = res.data.nonceStr;
						let paySign = res.data.paySign;
						let pk = res.data.package;
						console.log("package:"+pk);
						console.log("nonceStr:"+nonceStr);
						console.log("paySign:"+paySign);
						console.log("timeStamp:"+timeStamp);
						//小程序向微信支付平台发送请求验证支付的正确性,如果正确会返回支付的页面(支付二维码),支付成功后进入success函数
						uni.requestPayment({
							"timeStamp":timeStamp,
							"nonceStr":nonceStr,
							"paySign":paySign,
							"package":pk,
							"signType":"MD5",
							success(res){
								uni.showToast({
									title:"支付成功"
								})
								//用户支付成功之后,小程序向后端商户系统发送请求,让商户系统主动查询支付订单结果
								uni.request({
									url:that.url.activeQueryOrder,
									method:"POST",
									header:{
										"token":uni.getStorageSync("token")
									},
									data:{
										"orderId":id
									},
									//成功之后刷新当前页面
									success(res){
										//getCurrentPages()方法获取所有页面
										let pages = getCurrentPages()
										//当前页面是最后一个
										let page = pages[pages.length - 1]
										page.onShow()
									},
									fail(res){
										console.log("修改订单状态失败=====>"+id)
									}
								})
							},
							fail(res){
								uni.showToast({
									title:"支付失败"
								})
							}
						})
					},
				})
			}

后端代码


@Login
    @PostMapping("/microAppPayOrder")
    @ApiOperation("小程序支付")
    public R microAppPayOrder(@RequestBody PayOrderForm form, @RequestHeader HashMap<String, Object> map) {
        ValidatorUtils.validateEntity(form);
        String token = map.get("token").toString();
        Integer userId = Integer.parseInt(jwtUtils.getClaimByToken(token).getSubject());
        LambdaQueryWrapper<UserEntity> uew = new LambdaQueryWrapper<>();
        uew.eq(UserEntity::getUserId, userId);
        UserEntity user = userService.getOne(uew);
        if (user == null) {
            return R.error("用户不存在!");
        }
        Integer orderId = form.getOrderId();
        LambdaQueryWrapper<Order> oew = new LambdaQueryWrapper<>();
        oew.eq(Order::getId, orderId)
                .eq(Order::getUserId,userId);
        Order order = orderService.getOne(oew);
        if (order == null) {
            return R.error("该用户没有此订单!");
        }
        if (!Objects.equals(order.getStatus(), EnumUtil.PAY_STATUS_NO_PAY.getCode())) {
            return R.error("该订单已支付!");
        }
        //判断优惠券是否过期


        //判断活动是否过期


        //向微信平台发送创建支付订单的请求

        try {
            String openId = user.getOpenId();
            //微信支付的单位是分,要转换一下
            String amount = String.valueOf(order.getAmount().multiply(BigDecimal.valueOf(100)).intValue());
            WXPay wxPay = new WXPay(wxPayConfig);
            Map<String, String> paramMap = new HashMap<>();
            String nonceStr = WXPayUtil.generateNonceStr();
            paramMap.put("nonce_str", nonceStr);    //随机字符串
            paramMap.put("body", "商品备注信息");
            paramMap.put("out_trade_no", order.getCode());   //商品订单流水号,必须为一
            paramMap.put("total_fee", amount);              //订单金额
            paramMap.put("spbill_create_ip", "127.0.0.1");
            paramMap.put("notify_url", "127.0.0.1/notify"); //异步通知url  必须为外网地址
            paramMap.put("trade_type", "JSAPI");            //交易类型
            paramMap.put("openid", openId);
            Map<String, String> result = wxPay.unifiedOrder(paramMap);
            log.info("result:{}",result);
            //支付订单Id
            String prepayId = result.get("prepay_id");
            if (StringUtils.isNotBlank(prepayId)) {
                order.setPrepayId(prepayId);
                orderService.updateById(order);
            }else {
                log.error("微信支付出现异常,订单号:{}",orderId);
                return R.error("微信支付出现异常,订单号:{}" + orderId);
            }
            //发送数据给小程序
            paramMap.clear();
            paramMap.put("appId", wxConfiguration.getAppId());
            String timeStamp = String.valueOf(new Date().getTime());
            paramMap.put("timeStamp", timeStamp);
            paramMap.put("nonceStr", nonceStr);
            paramMap.put("package", "prepay_id=" + prepayId);
            paramMap.put("signType", "MD5");
            //根据组装的map和商户密钥生成签名
            String paySign = WXPayUtil.generateSignature(paramMap, wxConfiguration.getMchKey());
            return R.ok().put("package", "prepay_id=" + prepayId)
                    .put("timeStamp", timeStamp)
                    .put("nonceStr", nonceStr)
                    .put("paySign", paySign);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("微信支付出现异常,订单号:{}",orderId);
            return R.error("微信支付出现异常,订单号:{}" + orderId);
        }
    }


@PostMapping("/activeQueryOrder")
    @ApiOperation("向微信平台发起请求主动查询支付订单状态")
    public R activeQueryOrder(@RequestBody ActiveQueryOrderForm form,
                              @RequestHeader HashMap<String,Object> header) {
        ValidatorUtils.validateEntity(form);
        //0.先判断该用户下面有没有此订单
        String token = header.get("token").toString();
        Integer userId = Integer.parseInt(jwtUtils.getClaimByToken(token).getSubject());
        String orderId = form.getOrderId();
        LambdaQueryWrapper<Order> ew = new LambdaQueryWrapper<>();
        ew.eq(Order::getUserId, userId)
                .eq(Order::getId, orderId);
        Order order = orderService.getOne(ew);
        if (order == null) {
            return R.error("该用户没有此订单!");
        }
        //1.向微信平台发起请求查询订单是否支付成功
        Map<String, String> map = new HashMap<>();
        map.put("appid", wxConfiguration.getAppId());
        map.put("mch_id", wxConfiguration.getMchId());
        map.put("out_trade_no", order.getCode());
        map.put("nonce_str", WXPayUtil.generateNonceStr());
        try {
            String sign = WXPayUtil.generateSignature(map, wxConfiguration.getMchKey());
            map.put("sign", sign);
            WXPay wxPay = new WXPay(wxPayConfig);
            Map<String, String> result = wxPay.orderQuery(map);
            String returnCode = result.get("return_code");
            String resultCode = result.get("result_code");
            String tradeState = result.get("trade_state");
            if ("SUCCESS".equals(resultCode) && "SUCCESS".equals(returnCode)) {
                if ("SUCCESS".equals(tradeState)) {
                    order.setStatus(EnumUtil.PAY_STATUS_PAIED.getCode());
                    orderService.updateById(order);
                    return R.ok("微信支付成功,订单状态已修改为已支付!");
                }
            }
            log.error("微信支付失败!订单号:{}",orderId);
            return R.error("微信支付失败!");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("微信支付失败!订单号:{}",orderId);
            return R.error("微信支付失败!");
        }
    }

    @ApiOperation("微信异步通知")
    @PostMapping("/receiveWxMsg1")
    public String receiveWxMsg1(@RequestBody String messsge) throws Exception {
        log.info("message:====>{}", messsge);
        Map<String, String> map = WXPayUtil.xmlToMap(messsge);
        String resultCode = map.get("result_code");
        String returnCode = map.get("return_code");
        String outTradeNo = map.get("out_trade_no");
        if ("SUCCESS".equals(resultCode) && "SUCCESS".equals(returnCode)) {
            LambdaQueryWrapper<Order> ew = new LambdaQueryWrapper<>();
            ew.eq(Order::getCode, outTradeNo);
            Order order = new Order();
            order.setStatus(EnumUtil.PAY_STATUS_PAIED.getCode());
            orderService.update(order, ew);
            return "<xml>\n" +
                    "  <return_code><![CDATA[SUCCESS]]></return_code>\n" +
                    "  <return_msg><![CDATA[OK]]></return_msg>\n" +
                    "</xml>";
        }
        return null;
    }
Java开发实现微信小程序支付(微信支付) 目录一、前期准备工作1.申请小程序开发者账号并认证2.小程序开通微信支付3.开发指引4.到官方下载Java的支付SDK二、代码实现1.开发流程:2.实现步骤2.1 下单,生成待支付订单2.2 调用微信统一下单2.3 小程序发起微信支付3.后台业务逻辑涉及到的工具类及参数封装类3.1 WeChatPayDto3.2 WeChatPayUtil:微信支付工具类3.3 WXPayUtil、WxPayNotifyResponse3.4 HttpUtils工具类3.5 ErrorCode:返回码3.6 request 阅读详情

相关推荐

微信小程序支付流程

微信小程序支付流程 闲话不多说,先来简单的梳理一下微信小程序的支付流程: 上面呢是一张支付流程图,我们跟句上面的图片来进行讲解: 首先用户下单,点击按钮就会去发起一个请求道后端服务器,下单前要进行登录操作,在后台发起一个登录操作。 然后由我的后台登录访问到去请求微信的后台,得到一个openId。 得到openId之后的话才能去进行支付功能,然后再自己的后台去生成一个商户订单,商户订单要定义:支付类型,金额,我是谁(openId),商户Id,当然在做这个订单的时候还要进行一些加密操作,经过一系列的加密之

IT__zz的博客 2517

微信支付之 Token令牌对接

*

qq_39835505的博客 880

支付宝支付在微信小程序中也能实现?SpringBoot+沙箱教你一键搞定 —— 支付宝沙箱

在互联网时代,支付已成为各类应用中不可或缺的一环。而支付宝作为中国领先的支付平台,其支付功能被广大用户接受并信任。微信小程序作为一个轻量级的应用生态,为用户提供了丰富的功能体验。本次我们将探讨如何使用SpringBoot与支付宝沙箱支付在微信小程序中实现支付宝支付。"码小白:穷开发,启动"

2301_79932547的博客 2950

微信小程序登录获取Token以及微信支付

微信小程序登录获取Token相关流程 注意:只有获取了几个相关的参数,才能调用登录接口API

Usjsnsn的博客 5458

如何在微信小程序中对接微信支付

在微信小程序中集成微信支付,需要经过一系列步骤,包括注册小程序、申请微信支付、创建支付订单、调用支付API以及处理支付结果通知。尽管过程中可能会遇到一些问题,但只要按照文档要求进行配置和开发,基本都能顺利完成。希望本文能为你提供一些帮助,让你在微信小程序中顺利集成微信支付。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 2万+

泛微 OA - 根据流程 requestid 获取流程中的附件

在泛微 OA 流程中,附件是通过加密上传的,如果在第三方系统想要调用 OA 系统获取 OA 附件,暂时没有很好的方法实现。但是可以在本地进行调用,得到附件信息,拿到这些信息后,可以用过 url 地址在本地下载。

小松鼠的博客 5825

微信支付流程

微信支付 1.准备工作   1.APPID 2.appsecret 32位 用于获取access_token 最好在服务器端 3.APPKEY  128位  用于支付过程中生成app_signature  最好在服务器端 4.PartnerKey 微信公众平台模块生成的商户秘钥  最好在服务器端 2.获取access_token  调用各接口都使用这个值

你不勇敢,\\没人替你坚强 1329

vasp计算练习1-Si

si的vasp训练流程

qq_41074165的博客 3295

【学生管理系统】用户登录校验整合JWT生成token

token 是服务端生成的一串字符串,用来作为客户端进行请求的一个令牌。今天讲解的是用户登录校验整合JWT生成token进行身份校验。

四季轮换叶,一路招摇胜 1533

Windows 10/11 注册表 ProfileImagePath 误改修复:3步恢复用户登录与数据安全

本文详细介绍了Windows 10/11系统中因误改注册表ProfileImagePath键值导致用户无法登录的修复方法。通过3个关键步骤,包括定位SID、安全修复注册表项及验证处理,帮助用户恢复登录并保障数据安全。特别强调了操作顺序的重要性以避免数据丢失,适用于各类Windows用户账户登录错误的紧急处理。

chuoshao2508的博客 403

最小二乘拟合圆:使用拉格朗日乘子法

在本文中,我们将探讨如何使用拉格朗日乘子法来进行最小二乘拟合,并将其应用于拟合一个空间圆。首先,我们需要定义问题。给定一组二维或三维数据点,我们的目标是找到一个圆,使得这些数据点到圆的距离的平方和最小。为了找到最小值,我们需要计算拉格朗日函数的偏导数,并令其等于零。通过解决优化问题,我们可以找到最佳拟合的圆,以最小化数据点到圆的距离的平方和。其中,(x, y) 是圆心的坐标,r 是圆的半径,(xi, yi) 是数据点的坐标。其中,g(x, y, r) = 0 是约束条件,C 是常数,λ 是拉格朗日乘子。

TechProX的博客 473

微信小程序中怎么使用支付宝支付

查询资料发现,大多数的答案是:微信与支付宝属于互相竞争的关系,是两个不同的支付平台,目前是不支持互相通用的。微信小程序里面的程序软件属于内嵌于微信的服务,支持微信支付,但不能使用支付宝支付。也就是说: ①在小程序中生成支付宝二维码的方式,不可行 ②在小程序中内嵌H5网页后调用支付宝支付接口,也不可行,由于支付协议 那么我通过诱导的方式直接在浏览器使用支付呢?也就是: ③通过点击某个链接直接跳出小程...

weixin_43554228的博客 4万+

CloudCompare 和 PCL:点云网格化分析与处理

点云网格化是将点云数据转化为规则网格的过程,其主要思想是将离散的点云投影到一个平面上,然后对该平面进行划分,形成一系列小区域。在点云网格化方面,PCL 提供了各种算法和工具,可以实现高效的点云网格化操作。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化算法参数,如搜索半径和最大三角形边长等,执行了网格化操作,最后将网格化结果保存到输出文件中。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化参数,如分辨率等,执行了网格化操作,最后将网格化结果保存到输出文件中。

TechPulseZ的博客 1289

微信小程序实现支付宝支付——web-view实现

微信小程序实现支付宝支付——web-view实现

weixin_44889971的博客 1万+

uniapp - 获取设备麦克风权限+麦克风设备列表,用户可选择切换麦克风设备功能,选择麦克风采集设备后点击录制音频外部声音+可随时暂停/继续录音+记录音频录制时长(支持在线播放试听或下载MP3文件)

uniapp获取麦克风设备列表,uniapp录制声音,Uniapp获取麦克风权限,uniapp苹果ios安卓app获取麦克风设备列表,Uniapp H5获取浏览器麦克风并实现录音,Uniapp实现麦克风权限管理与音频录制全流程,uni-app实战案例:实现H5页面麦克风权限获取与录音功能,uni-app音频录制,uniapp麦克风授权窗口,uniapp获取iOS麦克风权限,实现前端录音并播放,把音频传给后端接口处理,获取麦克风并实现录音功能,前端获取/切换麦克风播放采集音频和采集音量大小,前端调用麦克风实现

🏆 前端领域优质创作者 2979

10、贝叶斯曲线拟合与预测分布详解

本文详细介绍了贝叶斯曲线拟合与预测分布的核心概念与计算方法。从最大似然估计出发,引入参数的先验分布,推导出后验分布与最大后验估计,并进一步展示如何通过积分获得完整的预测分布。文章解析了预测分布中均值与方差的构成,强调贝叶斯方法在量化不确定性方面的优势,涵盖金融、医疗、气象等实际应用场景。最后总结了操作步骤与未来研究方向,帮助读者系统掌握贝叶斯方法在回归问题中的应用。

android的专栏 104

微信小程序的支付流程 —— 总结

今天来说说,微信小程序的支付流程是怎么的? 首先,就是先了解一下小程序的应用场景 主要就是以下几个方面: 1、线下支付 2、公众号支付 3、小程序支付 4、pc网站支付 5、手机app支付 6、企业内部使用微信资金流动 不同场景下的支付措施 注意:在这里JSAPI就相当于是微信内部的一个支付方式,他在第三方App,比如说安卓的或者iOS的应用,要坐微信支付只可以通过App来支付。 注意点: 在苹果手机端的音频视频不能再iOS端上使用,会收到微信的限制。 建议用公众号和H5的方式实现,因.

weixin_46419373的博客 1万+

YOLOv11改进策略【注意力机制篇】| SE、CBAM、ECA、CA、Swin Transformer等注意力机制全面解析与应用

本文详细介绍了五种主流的注意力机制及其在YOLOv11中的应用。通过合理的模块选择和位置部署,注意力机制能够显著提升目标检测性能。

QQ_778132974的博客 873

微信小程序接入支付功能并实现支付

因此,在本文中,我们将介绍如何在微信小程序中实现微信支付。个人感觉类似微信小程序开发添加的request合法域名, 上面添加的这个目录,应该和你在后期在程序后台写的最终方法调用名一致,假设这里你设置的是 https://abc.cn/mypay/payOP。需要注意的是,在调用支付模块之前,需要先引入支付模块,并进行相应的设置和参数传递。2. 设置API密钥: 依次找到 商户平台->账号中心->API安全->设置APIv2密钥 设置后,可以把密钥拷贝出来记住,下面的code部分也需要该信息。

muzidigbig的博客 9945

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

微信小程序 实现支付流程

1、获取OpenID:通过wx.login()获得code,将code传给接口获得OpenID调用预支付接口,将OpenID与接口需要携带的其他参数,得到预支付核心数据;数据包含:【时间戳--timeStamp,随机字符串--nonceStr,预支付id--package,签名算法--signType,签名--paySign】调用wx.requestPayment(),传递上一步获取的5个预支付核心数据,得到支付结果最后,👏👏 😀😀😀 👍👍。

weixin_71403100的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

微信小程序实现支付功能——微信jsapi支付

微信小程序jsapi支付的实现涉及多个步骤,主要包括前端请求订单信息、后端处理订单并返回支付参数、前端调用jsapi进行支付等。

种一棵树,最好的时间是十年前,其次是现在。 6004

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

踩坑: 微信小程序支付流程(统一下单, 支付回调)

公司最近开发小程序,涉及到支付功能.现在支付功能已经做完,特此记录一下自己踩坑经验: 众所周知,微信小程序目前只能使用微信支付,而且微信小程序支付相对于app支付,h5支付都要简单一些,但是该支付文档对java这语言是非常不友好的,居然没有demo,网上虽说有很多博客,但是找了好多都是跑不通,乱七八糟的很多都跑不通,以下代码不是自己写的,大多都是这儿抄一点哪儿抄一顿,但是能跑通,亲测...

叶叶叶叶大爷的博客 6万+

uni.app实现微信小程序支付

uni.app实现微信小程序支付

chengcheng9876的博客 5654
上一篇: 解决在linux环境下启动jar时提示no main manifest attribute, in /xxxxx.jar异常
下一篇: 微信native支付
livel_java
博客等级 码龄9年 2916粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值