微信支付lavel是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信支付lavel是啥?相关的知识,希望对你有一定的参考价值。
Laravel 微信开发组件-WeChat 微信支付一、介绍
本教程是LAMP开发环境下基于larvel5.1LTS版进行的开发实例。
由于现在国内有很多优秀且具备开源精神的php开发者,因此出于节约时间成本和维护成本的考虑,微信开发采用组件化开发,我们没必要重复造轮子。本教程采用 overtrue 团队的 easywechat 组件进行微信的支付功能开发和实现。
由于这个组件功能过多 本篇博客主要介绍“扫码支付”的主要流程和思路。
二、composer安装
默认大家已经在自己的开发环境上已经安装了composer,并会一些简单的操作,安装命令:
composer require "overtrue/laravel-wechat:~3.0"
* 如果你用了 laravel-debugbar,请禁用或者关掉,否则这模块别想正常使用!!! * (但是composer提示是否可以关闭x-debug,会影响安装之类的提示,可以不去管它)
三、在laravel中进行配置
1.注册 ServiceProvider (找到 config/app.php 配置文件中,key为 providers 的数组,在数组中添加服务提供者):
Overtrue\\LaravelWechat\\ServiceProvider::class,
2.(可选)添加 * 外观 * 在app/config/app.php 的 aliases 数组里,添加 * 别名 * :
\'wechat\' =>Overtrue\\LaravelWechat\\ServiceProvider::class,
3.创建配置文件(在项目根目录中运行 artisan 命令,发布配置文件到你的项目中):
php artisan vendor:publish
此时在/config目录下会生成配置文件wechat.php,在里面输入你的微信商家信息,这里请注意保护隐私。
四、 微信支付飞起
1.配置微信商家信息,laravel根目录下的.ENV文件支持以下配置:
WECHAT_APPID
WECHAT_SECRET
WECHAT_TOKEN
WECHAT_AES_KEY
WECHAT_LOG_LEVEL
WECHAT_LOG_FILE
WECHAT_OAUTH_SCOPES
WECHAT_OAUTH_CALLBACK
WECHAT_PAYMENT_MERCHANT_ID
WECHAT_PAYMENT_KEY
WECHAT_PAYMENT_CERT_PATH
WECHAT_PAYMENT_KEY_PATH
WECHAT_PAYMENT_DEVICE_INFO
WECHAT_PAYMENT_SUB_APP_ID
WECHAT_PAYMENT_SUB_MERCHANT_ID
WECHAT_ENABLE_MOCK
你可以在/config/wechat.php中进行相关参数配置,也可以写在.ENV文件中,然后,wechat.php具体读取方法:
\'notify_url\' => env(\'NOTIFY_URL\', \'http://www.XXXXX.com/notify_url\'), // 回调地址
env()默认读取.env文件中常量的值,如果.env中没有定义该常量,则返回env()的第二个参数的值。
2.wechat.php文件中需要注意的地方
(1).\'log\'数组内是日志配置。
(2).\'payment\'数组是主要配置的数组,主要配置商户的信息和证书。
3.(重点)创建订单
(1).引入命名空间
use EasyWeChat\\Foundation\\Application;
use EasyWeChat\\Payment\\Order;
(2).填写订单信息
$attributes = [
\'trade_type\' => \'JSAPI\', // JSAPI,NATIVE,APP...
\'body\' => \'iPad mini 16G 白色\',
\'detail\' => \'iPad mini 16G 白色\',
\'out_trade_no\' => \'1217752501201407033233368018\',
\'total_fee\' => 5388,
\'notify_url\' => \'http://xxx.com/order-notify\', // 支付结果通知网址,如果不设置则会使用配置里的默认地址,我就没有在这里配,因为在.env内已经配置了。
// ...
];
// 创建订单
$order = new Order($attributes);
$result = $payment->prepare($order);
if ($result->return_code == \'SUCCESS\' && $result->result_code == \'SUCCESS\')
//生产那个订单后的逻辑
\\Log::info(\'生成订单号..\'.$data->order_guid);
//这一块是以ajax形式返回到页面上。
//用户的体验就是点击【确认支付】,验证码以弹层页面出来了(没错,还需要一个好用的弹层js)。
$ajax_data=[
\'html\' => json_encode(\\QrCode::size(250)->generate($result[\'code_url\'])),
\'out_trade_no\' => $data->order_guid,
\'price\' => $data->price
];
return $ajax_data;
else
return back()->withErrors(\'生成订单错误!\');
五、渲染页面
这里创建了订单,需要生成二维码图片,可以参考一下这个二维码图片组件。
Composer 设置
首先,添加 QrCode 包添加到你的 composer.json 文件的 require 里:
composer require "simplesoftwareio/simple-qrcode"
添加 Service Provider
注册 SimpleSoftwareIO\\QrCode\\QrCodeServiceProvider::class 至 config/app.php 的 providers 数组里.
添加 Aliases
最后,注册 \'QrCode\' => SimpleSoftwareIO\\QrCode\\Facades\\QrCode::class 至 config/app.php 的 aliases 数组里.
pay.blade.php内容
<script type="text/javascript" src=" asset(\'vendor/jquery.js\') "></script>
<script type="text/javascript" src=" asset(\'layer/layer.js\') "></script>
<input class="wechat_btn" type="button" value="确认支付"/>
!-- 这个页面需要有一些js代码,才能使支付功能更加美观可用无bug,比如ajax轮询,点击支付后的btn失效,放弃支付时关闭弹层等等 --
js内容
$(\'.wechat_btn\').click(function()
$(\'.my_order_guid\').val(\'\');
$(\'#code\').val(\'\');
//ajax生成二维码
data=
\'_token\':$(".token").val(),//令牌
\'money\':$(".money").val(),//商品价格
sendAjax(data, "/order", function (data)
//发送二维码过来(此处使用优美的layer弹层库)
layer.open(
type: 1,
title:\'微信支付\',
skin: \'layui-layer-rim\', //加上边框
area: [\'270px\', \'340px\'], //宽高
content: "<p style=\'color:red;text-align: center;\'>支付金额:"+data[\'price\']
+"元</p> <input type=\'hidden\' class=\'my_order_guid\' value=\'"+data[\'out_trade_no\']
+"\'/><div id=\'code\' style=\'text-align: center;\'>"+JSON.parse(data[\'html\'])+
"</div><p style=\'text-align: center;\'>请使用微信扫码支付</p><script> $(\'.layui-layer-close\').click(function() layer.msg(\'您已放弃本次支付\');setTimeout(\'window.location.reload()\',3000); );</script>"
//这里我把弹层库有关的一点点js写到content里面去了。
);
getInfo();
//这里写一个轮询,可以异步查询订单是否支付完成的信息,从而进行逻辑处理(比如轮询支付状态,成功了跳转页面),仅仅提点一下我的想法,轮询的代码不用找,没有贴。
);
);
六、回调函数
先放上主要代码再说:
public function notifyUrl(Request $request)
$app = new Application(config(\'wechat\'));
$response = $app->payment->handleNotify(function($notify, $successful)
if ($successful)
$order_arr=json_decode($notify,true);
$order_guid=$order_arr[\'out_trade_no\'];//订单号
//回调成功的逻辑
);
注意
(1).wechat发送回调是通过post方式,在路由处定义了之后,还需要在laravel项目中排除token验证,我建议在中间件中VerifyCsrfToken.php进行排除路由。
protected $except = [
//
\'/pay_success_notify\',
\'/To_rule_out_route\'
];
(2). * 重点!重点!重点! * 回调这里的处理可以说是重中之重,这里出岔子,可能会造成 用户支付成功后,微信的 * 回调没有进来 * ,后台回调的逻辑就没有执行,导致用户钱花了,东西没买上(即你的服务器上没有执行给付费用户修改支付状态等数据库操作)。另一种后果,如果没有正确返回微信参数,微信会多次发送回调信息来提醒你支付成功了,导致你的服务器 * 接受回调函数多遍 * 。而此时你也马马虎虎,没有在支付成功的逻辑上对用户的支付状态进行判断,导致逻辑用户充一次钱,在数据库却重复执行了好几次相关数据库操作。前者坑了付费用户,后者坑了你的公司,这里如果不注意的话,后果只会很严重,涉及到钱的地方要倍加小心。
(2).在回调路由指向的方法内,如果你的支付成功的逻辑成功运行了,需要return true;如果没有成功进行数据库操作,需要返回false;或不返回,微信会再一次发送回调信息(post方式)。
七、一些easywechat官方的建议:
这里需要注意的有几个点:
1.handleNotify 只接收一个 callable 参数,通常用一个匿名函数即可。
2.该匿名函数接收两个参数,这两个参数分别为:
$notify 为封装了通知信息的 EasyWeChat\\Support\\Collection 对象,前面已经讲过这里就不赘述了,你可以以对象或者数组形式来读取通知内容,比如:$notify->totalfee 或者 $notify[\'totalfee\']。
$successful 这个参数其实就是判断 用户是否付款成功了(result_code == ‘SUCCESS’)
3.该函数返回值就是告诉微信 “我是否处理完成”,如果你返回一个 false 或者一个具体的错误消息,那么微信会在稍后再次继续通知你,直到你明确的告诉它:“我已经处理完成了”,在函数里 return true; 代表处理完成。
4.handleNotify 返回值 $response 是一个 Response 对象,如果你要直接输出,使用 $response->send(), 在一些框架里不是输出而是返回:return $response。
5.注意:请把 “支付成功与否” 与 “是否处理完成” 分开,它俩没有必然关系。
比如:微信通知你用户支付完成,但是支付失败了(result_code 为 ‘FAIL’),你应该更新你的订单为支付失败,但是要告诉微信处理完成。
后记
1.在微信开发中,大量用到了laravel自带的Log查错的方法,当var_dump(),echo(),dd()等方法不能查看错误信息是,使用日志查错就可以解决了。怎样使用laravel的log服务,这个以后会讲。
2.本项目开发可以说是组件化开发,有开发速度快,代码质量高,维护成本低等优点,本例的微信开发是一个缩影。
[原文地址](http://www.blog8090.com/) 参考技术A partner是第3方的意思
商户系统和微信支付系统主要交互说明:
步骤知1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见道【统一下单API】。
步骤3:统一下单接口返回正常的prepay_id,版再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
步骤5:商户后台接收支付通知权。api参见【支付结果通知API】
步骤6:商户后台查询支付结果。,api参见【查询订单API】 参考技术B 没有休息日算违法吗?我在的单位周
加班不违法,但不给加班工资就违法了。 第三十六条 国家实行劳动者每日工作时间不超过八小时、平均每周工作时间不超过四十四小时的工时制度。 第三十七条 对实行计件工作的劳动者,用人单位应当根据本法第三十六条规定的工时制度合理确定其劳动定额和计件报酬标准。
第三十八条 用人单位应当保证劳动者每周至少休息一日。 第三十九条 企业因生产特点不能实行本法第三十六条、第三十八条规定的,经劳动行政部门批准,可以实行其他工作和休息办法。
第四十条 用人单位在下列节日期间应当依法安排劳动者休假: 第三十二条 有下列情形之一的,劳动者可以随时通知用人单位解除劳动合同: (一)在试用期内的; (二)用人单位以暴力、威胁或者非法限制人身自由的手段强迫劳动的; (三)用人单位未按照劳动合同约定支付劳动报酬或者提供劳动条件的 (一)元旦; (二)春节; (三)国际劳动节; (四)国庆节; (五)法律、法规规定的其他休假节日。
第四十一条 用人单位由于生产经营需要,经与工会和劳动者协商后可以延长工作时间,一般每日不 得超过一小时;因特殊原因需要延长工作时间的,在保障劳动者身体健康的条件下延长工作时间每日不得超过三小时,但是每月不得超过三十六小时。
第四十二条 有下列情形之一的,延长工作时间不受本法第四十一条的限制: (一)发生自然灾害、事故或者因其他原因,威胁劳动者生命健康和财产安全,需要紧急处理的; (二)生产设备、交通运输线路、公共设施发生故障,影响生产和公众利益,必须及时抢修的; (三)法律、行政法规规定的其他情形。
第四十三条 用人单位不得违反本法规定延长劳动者的工作时间。 第四十四条 有下列情形之一的,用人单位应当按照下列标准支付高于劳动者正常工作时间工资的工资报酬: (一)安排劳动者延长工作时间的,支付不低于工资的百分之一百五十的工资报酬; (二)休息日安排劳动者工作又不能安排补休的,支付不低于工资的百分之二百的工资报酬; (三)法定休假日安排劳动者工作的,支付不低于工资的百分之三百的工资报酬。
第四十五条 国家实行带薪年休假制度。 劳动者连续工作一年以上的,享受带薪年休假。具体办法由国务院规定。 第九十条 用人单位违反本法规定,延长劳动者工作时间的,由劳动行政部门给予警告,责令改正,并可以处以罚款。
第九十一条 用人单位有下列侵害劳动者合法权益情形之一的,由劳动行政部门责令支付劳动者的工资报酬、经济补偿,并可以责令支付赔偿金: (一)克扣或者无故拖欠劳动者工资的; (二)拒不支付劳动者延长工作时间工资报酬的; (三)低于当地最低工资标准支付劳动者工资的; (四)解除劳动合同后,未依照本法规定给予劳动者经济补偿的。
微信支付—微信H5支付「微信内部浏览器」
前言
微信支付-微信H5外部浏览器支付
微信支付-微信H5内部浏览器支付「本文」
微信支付-PC端扫码支付
本篇是微信支付系列的第二篇、微信H5内部浏览器支付,关于微信H5外部浏览器唤起微信APP支付,请参考上一篇文章。
开发环境:Java + SpringBoot + Vue +WxJava(开源SDK)
扫盲补充:关于微信内部浏览器支付,支付时会直接调起微信支付,不同于外部浏览器支付,内部浏览器支付首先需要获得当前支付用户对该公众号的唯一标识 openId「是否关注都是唯一的」,拿到 openId 后,结合后端其他参数调用微信预支付接口,获得预支付id,然后交由前端发起微信支付,支付成功后回调后端接口。
如下是正文部分。
Java支付项目实战教程,包括支付宝,微信等支付方式,不看亏!1、获取Code
要想获得用户唯一标识 openid,首先需要办的事就是获得 code。
code 部分在本文中交由前端去获取「调用微信authorize授权方法」,拿到 code 后传递给后端换取 openid「用户唯一标识」;通常这个操作都是在用户登录时去实现的,登录成功后同时拿到 openid,而且还可以存(更新)到该用户的数据库方便后面使用。
前端获取code,具体如下:
let ua = navigator.userAgent.toLowerCase()
if (ua.match(/MicroMessenger/i) == \'micromessenger\') {
if (!this.GetQueryString(\'code\')) {
alert("跳转");
// this.$vux.toast.text(\'微信授权中……\', \'default\')
let currentUrl = encodeURIComponent(window.location.href)
window.location.href = \'https://open.weixin.qq.com/connect/oauth2/authorize?appid=我是appid&redirect_uri=\'+currentUrl+\'&response_type=code&scope=snsapi_base&state=STATE&connect_redirect=1#wechat_redirect\'
} else {
let code = this.GetQueryString(\'code\')
// 此处调用后端方法,通过 code 换取 openid
}
}
补充:授权链接中的 scope 参数分为 snsapi_base、snsapi_userinfo,snsapi_base 可以获得用户的唯一标识 openid,snsapi_userinfo 则在此基础上获得用户资料「昵称、头像等」
上述方法中 ua.match(/MicroMessenger/i) 是用来判断是否是微信环境的, GetQueryString 方法用来获取微信中的 code,如果当前浏览器 url 并没有附带 code 参数,那么就会调用微信的 authorize 方法进行授权,授权后获得 code,该方法具体如下:
GetQueryString (name) {
let url = new RegExp(\'(^|&)\' + name + \'=([^&]*)(&|$)\')
let newUrl = window.location.search.substr(1).match(url)
if (newUrl != null) {
return unescape(newUrl[2])
} else {
return false
}
},
2、换取openid
拿到 code 后,下一步就是调用后端接口换取 openid 了, 简单看一下换取 openid 的后端方法:
try {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=我是appid&secret=我是secret&grant_type=authorization_code"+
"&code=" + loginRequest.getCode();
String body = RestTemplateUtils.get(url,new JSONObject());
JSONObject jsonObject = JSONObject.parseObject(body);
Integer errcode = jsonObject.getInteger("errcode");
if (errcode == null || errcode == 0) {
String openId = jsonObject.getString("openid");
//将此次登录的openId,暂且放入user的域里面,支付的时候会用到
System.out.println("openId:"+openId);
loginRequest.setOpenId(openId);
return ResultUtil.success(userService.login(loginRequest));
}else{
logger.error("[微信第三方登录] 异常”);
抛出自定义异常
throw new CommonException("微信第三方登录异常","");
}
} catch (Exception e) {
logger.error("[微信第三方登录] 异常", e);
抛出自定义异常
throw new CommonException("微信第三方登录异常","");
}
简单说一下该方法,前端传递 code 致后端方法,后端拿到 code 后,调用 access_token 接口获取 openid,同时完成登录操作。
至此,已经成功登录并拿到用户 openid 了,接下来就是调用支付接口。
3、预支付接口
上边已经提到了,内部浏览器支付是交由前端发起的,但是又依赖于后端的 预支付接口,所以先来看一下后端预支付接口:
/**
* 生成订单「微信内部浏览器」
* @return
*/
@Transactional
public Object wxPrepay(Orders orders,String openId) {
Object result = null;
try {
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setOutTradeNo(orders.getOrderId());
orderRequest.setOpenid(openId);
orderRequest.setBody(“我是商品描述信息");
orderRequest.setTotalFee(orders.getAmount().multiply(new BigDecimal("100")).intValue());
orderRequest.setSpbillCreateIp(DispatchParams.getInstance().getWechatSpbillCreateIp());
orderRequest.setTradeType(WxPayConstants.TradeType.JSAPI);
result = wxPayService.createOrder(orderRequest);
if (result instanceof WxPayMpOrderResult) {
String prepayId = ((WxPayMpOrderResult)result).getPackageValue();
String paySign = ((WxPayMpOrderResult) result).getPaySign();
prepayId = prepayId.replace("prepay_id=", "");
orders.setPrepayId(prepayId);
orders.setSign(paySign);
ordersDao.updateOrders(orders);
}
} catch (WxPayException e) {
logger.error("[微信支付] 异常", e);
抛出自定义全局异常
throw new CommonException(WechatStatusEn.WECHAT_CREATE_CODE_ERROR.getErrorMsg()+"\':微信支付异常", WechatStatusEn.WECHAT_CREATE_CODE_ERROR.getErrorCode());
} catch (Exception e) {
logger.error("[预付款异常]", e);
抛出自定义全局异常
throw new CommonException(WechatStatusEn.WECHAT_CREATE_CODE_ERROR.getErrorMsg()+"\':预付款异常", WechatStatusEn.WECHAT_CREATE_CODE_ERROR.getErrorCode());
}
return result;
}
简单说一下预支付方法,首先是根据自己情况创建订单记录,然后就是通过 openid 调用 wxPayService.createOrder 方法「WxJava」获取预支付id,该方法返回的实体为 WxPayMpOrderResult,实体参数为前端调起微信支付的必要参数,具体如下:
private String appId;
private String timeStamp;
private String nonceStr;
@XStreamAlias("package")
private String packageValue;
private String signType;
private String paySign;
为啥获得的预支付id没有用到呀?上方返回的参数并没有看到呀!
其实不然,属性 packageValue 的值为 prepay_id=预支付id ,该参数是必须的。
4、前端调用,发起支付
至此,后端基本完成了,我们将参数传递给前端调用,直接模拟返回后的数据:
假设下方是调用接口返回的数据
console.log(“我是后端返回的数据 - res:"+JSON.stringify(res))
const payParam = {
appId: res.appId,
nonceStr: res.nonceStr,
package: res.packageValue,
timeStamp: res.timeStamp,
signType: res.signType,
paySign: res.paySign,
}
if (typeof WeixinJSBridge === \'undefined\') {
if (document.addEventListener) {
document.addEventListener(\'WeixinJSBridgeReady\', this.onBridgeReady(payParam), false)
} else if (document.attachEvent) {
document.attachEvent(\'WeixinJSBridgeReady\', this.onBridgeReady(payParam))
document.attachEvent(\'onWeixinJSBridgeReady\', this.onBridgeReady(payParam))
}
} else {
this.onBridgeReady(payParam)
}
发起支付的 onBridgeReady 方法:
onBridgeReady(res){
alert("发起请求:"+JSON.stringify(res));
WeixinJSBridge.invoke(
\'getBrandWCPayRequest\', {
"appId":res.appId, //公众号名称,由商户传入
"timeStamp":res.timeStamp, //时间戳,自1970年以来的秒数
"nonceStr":res.nonceStr, //随机串
"package":res.package, // prepay_id=xxx
"signType":res.signType, //微信签名方式:
"paySign":res.paySign //微信签名
},
function(res){
alert(JSON.stringify("我是支付返回的信息:\\n"+res));
alert("我是支付返回的信息:\\n"+res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
alert("支付成功了");
}
}
);
}
5、效果截图
再来简单总结一下,首先由前端获取 code,获取 code 后传递给后端换取 openid,openid 是预支付必须的参数,前端发起支付时,需要6个参数,此时调用后端预支付接口获取「wxPayService.createOrder」,前端支付成功后同样微信会自动回调后端 notify 接口,具体如下「代码仅供参考」:
@RequestMapping(value = "/notify")
@ResponseBody
public String notify(@RequestBody String body) throws Exception {
WxPayOrderNotifyResult result = null;
try {
result = wxPayService.parseOrderNotifyResult(body);
} catch (WxPayException e) {
logger.error("[微信解析回调请求] 异常", e);
return WxPayNotifyResponse.fail(e.getMessage());
}
logger.info("处理微信支付平台的订单支付");
logger.info(JSONObject.toJSONString(result));
String appid = result.getAppid();//应用ID
String attach = result.getAttach();//商家数据包
String bank_type =result.getBankType();//付款银行
Integer cash_fee = result.getCashFee();//现金支付金额
String fee_type = result.getFeeType();//货币种类
String is_subscribe = result.getIsSubscribe();//是否关注公众账号
String mch_id = result.getMchId();//商户号
String nonce_str = result.getNonceStr();//随机字符串
String openid = result.getOpenid();//用户标识
String out_trade_no = result.getOutTradeNo();// 获取商户订单号
String result_code = result.getResultCode();// 业务结果
String return_code = result.getReturnCode();// SUCCESS/FAIL
String sign = result.getSign();// 获取签名
String time_end = result.getTimeEnd();//支付完成时间
Integer total_fee = result.getTotalFee();// 获取订单金额
String trade_type = result.getTradeType();//交易类型
String transaction_id = result.getTransactionId();//微信支付订单号
//如果成功写入数据库
if("SUCCESS".equals(return_code)) {// 如果微信返回的结果是success,则修改订单状态
Orders orders = ordersDao.selectByOrderId(out_trade_no);
// 验证签名
if(orders != null){
if(!"1".equals(orders.getOrderStatus())){//判断是否订单已经完成了
// 判断金额是否跟数据库订单金额一致,放置人为修改
if(orders.getAmount().multiply(new BigDecimal("100")).compareTo(new BigDecimal(total_fee)) == 0){
//更新订单状态
业务逻辑处理部分...
return WxPayNotifyResponse.success("订单已经处理成功!");
}else{
logger.error("微信:金额不一致!");
return WxPayNotifyResponse.fail("订单金额不一致");
}
}else {
return WxPayNotifyResponse.success("订单已经处理成功!");
}
}else{
return WxPayNotifyResponse.fail("商户订单号不匹配");
}
}
System.out.println("回调成功");
System.out.println("----返回给微信的xml:" + result);
return WxPayNotifyResponse.success("支付成功!");
}
最后
博客地址:https://www.cnblogs.com/niceyoo
如果觉得这篇文章有丶东西,不放关注一下我,关注是对我最大的鼓励~
18年专科毕业后,期间一度迷茫,最近我创建了一个公众号用来记录自己的成长。
以上是关于微信支付lavel是啥?的主要内容,如果未能解决你的问题,请参考以下文章