微信小程序 后端开发开发,微信小程序 后端开发提供了微信支付接口,但需要后端服务器先调用支付功能是什么意思?

微信小程序开发(五)小程序支付-统一下单
准确来说小程序的支付在上个月就已经做完了,只是那个时候项目原型和UI还没出来就没正式动工。现在项目快做完了,就有时间写博客了。
在做小程序支付希望你已经熟读微信的文档和。且你已经有了
AppID: "wx****************",
Secret: "********************************",
Mch_id: "**********",
Mch_key: "********************",
关于上面的这4个数据的获取,请自行在自己的账号中获取和设置。且你已经有了用户的openid。。
小程序接口
wx.requestPayment({
'timeStamp': '',
'nonceStr': '',
'package': '',
'signType': 'MD5',
'paySign': '',
'success':function(res){
'fail':function(res){
小程序接口就暴露这一个方法。这个方法有4个参数是需要后台去获取的。
其实大部分工作都是后台的事情。
后端主要是的这个接口https://api.mch./pay/unifiedorder。
这里主要就是几个:
统一下单签名
function paysignjsapi(appid,body,mch_id,nonce_str,notify_url,openid,out_trade_no,spbill_create_ip,total_fee) {
var ret = {
appid: appid,
body: body,
mch_id: mch_id,
nonce_str: nonce_str,
notify_url:notify_url,
openid:openid,
out_trade_no:out_trade_no,
spbill_create_ip:spbill_create_ip,
total_fee:total_fee,
trade_type: 'JSAPI'
var str = raw(ret);
str = str + '&key='+
var md5Str = cryptoMO.createHash('md5').update(str).digest('hex');
md5Str = md5Str.toUpperCase();
return md5S
function raw(args) {
var keys = Object.keys(args);
keys = keys.sort();
var newArgs = {};
keys.forEach(function(key) {
newArgs[key.toLowerCase()] = args[key];
var str = '';
for(var k in newArgs) {
str += '&' + k + '=' + newArgs[k];
str = str.substr(1);
小程序paySign
function paysignjs(appid, nonceStr, package, signType, timeStamp) {
var ret = {
appId: appid,
nonceStr: nonceStr,
package: package,
signType: signType,
timeStamp: timeStamp
var str = raw1(ret);
str = str + '&key='+
return cryptoMO.createHash('md5').update(str).digest('hex');
function raw1(args) {
var keys = Object.keys(args);
keys = keys.sort()
var newArgs = {};
keys.forEach(function(key) {
newArgs[key] = args[key];
var str = '';
for(var k in newArgs) {
str += '&' + k + '=' + newArgs[k];
str = str.substr(1);
统一下单后端实现
var wxConfig = require('../wx_pay/wx_x_config');
var cryptoMO = require('crypto');
var parseString = require('xml2js').parseS
var key = wxConfig.Mch_
router.all('/api/wxpay/unifiedorder', function(req, res, next) {
var param = req.query || req.
var openid = param.
var spbill_create_ip = req.ip.replace(/::ffff:/, '');
var body = '测试支付';
var notify_url = '/api/wxpay'
var nonce_str = getNonceStr();
var out_trade_no = wxConfig.getWxPayOrdrID();
var total_fee = '1';
var timestamp = Math.round(new Date().getTime()/1000);
var bodyData = '&xml&';
bodyData += '&appid&' + wxConfig.AppID + '&/appid&';
bodyData += '&body&' + body + '&/body&';
bodyData += '&mch_id&' + wxConfig.Mch_id + '&/mch_id&';
bodyData += '&nonce_str&' + nonce_str + '&/nonce_str&';
bodyData += '&notify_url&' + notify_url + '&/notify_url&';
bodyData += '&openid&' + openid + '&/openid&';
bodyData += '&out_trade_no&' + out_trade_no + '&/out_trade_no&';
bodyData += '&spbill_create_ip&' + spbill_create_ip + '&/spbill_create_ip&';
bodyData += '&total_fee&' + total_fee + '&/total_fee&';
bodyData += '&trade_type&JSAPI&/trade_type&';
var sign = paysignjsapi(
wxConfig.AppID,
wxConfig.Mch_id,
nonce_str,
notify_url,
out_trade_no,
spbill_create_ip,
bodyData += '&sign&' + sign + '&/sign&';
bodyData += '&/xml&';
var urlStr = 'https://api.mch./pay/unifiedorder';
url: urlStr,
method: 'POST',
body: bodyData
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
var returnValue = {};
parseString(body, function (err, result) {
if (result.xml.return_code[0] == 'SUCCESS') {
returnValue.msg = '操作成功';
returnValue.status = '100';
returnValue.out_trade_no = out_trade_
returnValue.nonceStr = result.xml.nonce_str[0];
returnValue.timestamp = timestamp.toString();
returnValue.package = 'prepay_id=' + result.xml.prepay_id[0];
returnValue.paySign = paysignjs(wxConfig.AppID, returnValue.nonceStr, returnValue.package, 'MD5',timestamp);
res.end(JSON.stringify(returnValue));
returnValue.msg = result.xml.return_msg[0];
returnValue.status = '102';
res.end(JSON.stringify(returnValue));
wxConfig代码:
var wxConfig = {
AppID: "wx****************",
Secret: "********************************",
Mch_id: "**********",
Mch_key: "********************",
getWxPayOrdrID: function(){
var myDate = new Date();
var year = myDate.getFullYear();
var mouth = myDate.getMonth() + 1;
var day = myDate.getDate();
var hour = myDate.getHours();
var minute = myDate.getMinutes();
var second = myDate.getSeconds();
var msecond = myDate.getMilliseconds();
if(mouth & 10){
mouth = String(String(0) + String(mouth));
if(day & 10){
day = String(String(0) + String(day));
if(hour & 10){
hour = String(String(0) + String(hour));
if(minute & 10){
minute = String(String(0) + String(minute));
if(second & 10){
second = String(String(0) + String(second));
if (msecond & 10) {
msecond = String(String(00) + String(second));
} else if(msecond &= 10 && msecond & 100){
msecond = String(String(0) + String(second));
var currentDate = String(year) + String(mouth) + String(day) + String(hour) + String(minute) + String(second) + String(msecond);
return currentD
module.exports = wxC
payTap: function(){
var self =
wx.request({
url: '/api/wxpay/unifiedorder',
openid: self.data.openid
success: function(res){
if(res.data.status == 100){
var payModel = res.
wx.requestPayment({
'timeStamp': payModel.timestamp,
'nonceStr': payModel.nonceStr,
'package': payModel.package,
'signType': 'MD5',
'paySign': payModel.paySign,
'success': function (res) {
wx.showToast({
title: '支付成功',
icon: 'success',
duration: 2000
'fail': function (res) {
fail: function(){
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?扫码下载APP
关注微信公众号
您是个人用户,您可以认领企业号
账号密码登录
一周内自动登录
免密码登录
获取验证码
第三方账号登录
Hello,新朋友
在发表评论的时候你至少需要一个响亮的昵称
标题诱导点击
标题和内容无关
排版不合理
纯娱乐搞怪
肤浅无意义
用词不准确
语句无逻辑
论证无逻辑
微信小程序接入微信支付,只需3步
首发且原创
时间:05-17 10:12
阅读:1228次
来源:三尺信息科技
摘要:微信小程序开发出来后,想要用在线支付功能怎么办?毕竟在小程序里面实现微信支付的话还是会带来很大的便捷的。有过开发服务号下微信支付经验的亲会发现,其实小程序里的微信支付和服务号里面的开发过程很像。
移步到微官网原文链接:开发出来后,想要用在线支付功能怎么办?毕竟在小程序里面实现微信支付的话还是会带来很大的便捷的。有过开发服务号下微信支付经验的亲会发现,其实小程序里的微信支付和服务号里面的开发过程很像。那么具体过程是怎样的呢?移步到微种草君七嬷嬷带你瞧瞧:Step1:开通微信支付和微信商户号这个过程几乎就和开通服务号的微信支付一样。Step2:获得用户的 OpenID首先,我们需要在小程序的客户端的逻辑层中,获取当前用户的 OpenID。通过调用 wx.login方法,可以得到用户的code,然后开发者服务器使用登录凭证code 获取 openid。  wx.login({  success:
function (res) {  if
(res.code) {  //发起网络请求  wx.request({  url:
'https://yourwebsit/onLogin',  method:
'POST',  data:
{  code:
res.code  },  success:
function (res) {  var
openid = res.data.  },  fail:
function (err) {  console.log(err)  }  })  }  else
{  console.log('获取用户登录态失败!'
+ res.errMsg)  }  }  });  var
code = req.param("code");  request({  url:
"https://api./sns/jscode2session?appid=" + appid + "&secret=" +
secret + "&js_code=" + code +
"&grant_type=authorization_code",  method:
'GET'  },
function (err, response, body) {  if
(!err && response.statusCode == 200) {  res.json(JSON.parse(body));  }  });Step3:获取
prepay_id和支付签名验证paySign这一步的过程,和服务号里的微信支付过程一样。这个过程区分为客户端操作,以及服务器端的操作。首先来看一下客户端逻辑层实现。在服务号里,我们是通过如下的代码来调起支付功能:  function
jsApiCall() {  WeixinJSBridge.invoke('getBrandWCPayRequest',
{  "appId":
"", //公众号名称,由商户传入  "timeStamp":
"", //时间戳,自1970年以来的秒数  "nonceStr":
"", //随机串  "package":
"prepay_id=",  "signType":
"MD5", //微信签名方式:  "paySign":
"" //微信签名  },
function (res) {  WeixinJSBridge.log(res.err_msg);  if
(res.err_msg == "get_brand_wcpay_request:ok") {  ;  }  else
{  ;  }  });  }在小程序里,我们是通过 wx.requestPayment 方法调起支付功能。当然,在这之前,我们先要获取 prepay_id。  wx.request({  url:
'https://yourwebsit/service/getPay',  method:
'POST',  data:
{  bookingNo:
bookingNo,  total_fee:
total_fee,  openid:
openid  },  header:
{  'content-type':
'application/json'  },
success: function (res) {  wx.requestPayment({  'timeStamp':
timeStamp  ,
'nonceStr': nonceStr  ,
'package': 'prepay_id=' + res.data.prepay_id  ,
'signType': 'MD5'  ,
'paySign': res.data._paySignjs  ,
'success': function (res) {  console.log(res);  }  ,
'fail': function (res) {  console.log('fail:'
+ JSON.stringify(res));  }  })  },  fail:
function (err) {  console.log(err)  }  })在服务器端,我们需要实现的是 prepay_id
的获取,以及签名 paySign 的获取。  var
bookingNo = req.param("bookingNo");  var
total_fee = req.param("total_fee");  var
openid = req.param("openid");  var
body = "费用说明";  var
url = "https://api.mch./pay/unifiedorder";  var
formData = "";  formData
+= "appid"; //appid  formData
+= "test";  formData
+= "" + body + "";  formData
+= "mch_id"; //商户号  formData
+= "nonce_str";  formData
+= "notify_url";  formData
+= "" + openid + "";  formData
+= "" + bookingNo + "";  formData
+= "spbill_create_ip";  formData
+= "" + total_fee + "";  formData
+= "JSAPI";  formData
+= "" + paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid,
bookingNo, spbill_create_ip, total_fee, 'JSAPI') + "";  formData
+= "";  request({  url:
url,  method:
'POST',  body:
formData  },
function (err, response, body) {  if
(!err && response.statusCode == 200) {  var
prepay_id = getXMLNodeValue('prepay_id', body.toString("utf-8"));  var
tmp = prepay_id.split('[');  var
tmp1 = tmp[2].split(']');  //签名  var
_paySignjs = paysignjs(appid, mch_id, 'prepay_id=' + tmp1[0], 'MD5',
timeStamp);  var
o = {  prepay_id:
tmp1[0]  ,
_paySignjs: _paySignjs  }  res.send(o);  }  });下面是用到的函数:  function
paysignjs(appid, nonceStr, package, signType, timeStamp) {  var
ret = {  appId:
appid,  nonceStr:
nonceStr,  package:
package,  signType:
signType,  timeStamp:
timeStamp  };  var
string = raw1(ret);  string
= string + '&key=' +  console.log(string);  var
crypto = require('crypto');  return
crypto.createHash('md5').update(string, 'utf8').digest('hex');  };  function
raw1(args) {  var
keys = Object.keys(args);  keys
= keys.sort()  var
newArgs = {};  keys.forEach(function
(key) {  newArgs[key]
= args[key];  });  var
string = '';  for
(var k in newArgs) {  string
+= '&' + k + '=' + newArgs[k];  }  string
= string.substr(1);  return
  };  function
paysignjsapi(appid, attach, body, mch_id, nonce_str, notify_url, openid,
out_trade_no, spbill_create_ip, total_fee, trade_type) {  var
ret = {  appid:
appid,  attach:
attach,  body:
body,  mch_id:
mch_id,  nonce_str:
nonce_str,  notify_url:
notify_url,  openid:
openid,  out_trade_no:
out_trade_no,  spbill_create_ip:
spbill_create_ip,  total_fee:
total_fee,  trade_type:
trade_type  };  var
string = raw(ret);  string
= string + '&key=' +  var
crypto = require('crypto');  return
crypto.createHash('md5').update(string, 'utf8').digest('hex');  };  function
raw(args) {  var
keys = Object.keys(args);  keys
= keys.sort()  var
newArgs = {};  keys.forEach(function
(key) {  newArgs[key.toLowerCase()]
= args[key];  });  var
string = '';  for
(var k in newArgs) {  string
+= '&' + k + '=' + newArgs[k];  }  string
= string.substr(1);  return
  };  function
getXMLNodeValue(node_name, xml) {  var
tmp = xml.split("");  var
_tmp = tmp[1].split("");  return
_tmp[0];}好啦,简简单单三步,so
easy是不是?就可以实现对接微信支付功能了。上一个效果图:
声明:本文由三尺信息科技企业号发布,依据企业号用户协议,该企业号为文章的真实性和准确性负责。创头条作为品牌传播平台,只为传播效果负责,在文章不存在违反法律规定的情况下,不继续承担甄别文章内容和观点的义务。
关注企业号
移步到微是基于微信企业号平台而开发的以流程审批与万能表单为核心的新一代移动办公系统。通过移步到微平台,企业可以让员工更好地使用微信进行移动化办公。
TA的其他文章
14455次阅读
14536次阅读
14363次阅读
14634次阅读
19408次阅读
24小时热文
1.7万次阅读
1.2万次阅读
9345次阅读
9178次阅读
9004次阅读
8801次阅读
7642次阅读
7638次阅读
阅读下一篇
南京交警与共享单车企业联手整治“弃车拒罚”者
创头条精选
扫描二维码关注
微信扫码咨询最近开发微信小程序进入到支付阶段,一直以来从事App开发,所以支付流程还是熟记于心的。但是微信小程序的支付就有点奇怪了,应用的创建是在公众号里,但是文档的介绍却在公众号中无法找到直接入口,甚是不解,而且小程序的师傅到底是属于公众号支付范畴还是app支付范畴也成疑问。下面是小程序支付文档的入口(嵌套在小程序api中):
小程序支付步骤:
2,根据预支付数据+签名——&发起支付
3,支付回调
下面对这3个步骤进行简单描述:
1,预支付。该接口通过前端提交需支付的信息(订单号、价格等)给开发者服务器,开发者服务器在提交到微信,而后返回真正前端需要进行支付的一些信息;eg:
开发者服务器的预支付接口:
https://()htm?total_fee=100&cid=6001&orderCodes=
&&&&&sign&:&A2****************A6&,
&&&&&timestamp&:&14****************68&,
&&&&&package&:&Sign=WXPay&,
&&&&&partnerId&:&14****************02&,
&&&&&appid&:&wx****************ab&,
&&&&&nonceStr&:&9f****************37&,
&&&&&prepayId&:&wx****************54&
2,发起支付(需要注意的是发起支付是不需要上传appid,
但是签名paySign需要appid ,而且放在第一个)
wx.requestPayment({
nonceStr: res.data.nonceStr,
package: &prepay_id=&+res.data.prepayId,
signType: 'MD5',
timeStamp: res.data.timestamp,
paySign: sign,//五个字段参与签名(区分大小写):appId,nonceStr,package,signType,timeStamp(需要注意的是,这5个参数签名排序的顺序按照ASCII字典序排序)
success: function(res){
console.log(&支付成功&);
fail: function() {
complete: function() {
生成签名sign
微信小程序下载地址:https://code.csdn.net/snippets/2019875/master/download
var MD5Util = require('../../../utils/md5.js');var sign = '';
//顺序按照ASCII字典序排序
var signA = &appId=&+app.appId+&&nonceStr=&+res.data.nonceStr+&&package=prepay_id=&+res.data.prepayId+&&signType=MD5&timeStamp=&+res.data.
var signB = signA+&&key=&+app.
sign = MD5Util.MD5(signB).toUpperCase();
生成签名上面是我的代码,不是很清晰, 下面列出来官方文档的详细描述:
假设传送的参数如下:
appid: wxd930ea5d5a258f4f(需要注意的是appid 在wx.requestPayment({})发起支付是不上传,但是签名时需要)
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
stringA=&appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=&nonce_str=ibuaiVcKdpRxkhJA&;
第二步:拼接API密钥:
stringSignTemp=&stringA&key=c09247ec02edce69f6a2d&
sign=MD5(stringSignTemp).toUpperCase()=&9A0AA9CF3B7&
此时的sign 用于wx.requestPayment 上传参数paySign。
最终得到最终发送的数据:
&appid&wxd930ea5d5a258f4f&/appid&
&mch_id&&/mch_id&
&device_info&1000&device_info&
&body&test&/body&
&nonce_str&ibuaiVcKdpRxkhJA&/nonce_str&
&sign&9A0AA9CF3B7&/sign&
OK, 微信小程序支付完成。66666
本文已收录于以下专栏:
相关文章推荐
微信小程序支付第一步
进入小程序,下单,请求下单支付,调用小程序登录API来获取Openid(https://mp./debug/wxadoc/dev/api/api-lo...
本文主要讲述微信小程序接入微信支付开发过程中遇到的坑,分为两大块,小程序端和后台接口封装。
前段时间为公司商城加上了微信支付,中间各种困恼。今天因为改点东西,重拾了出来,就顺便简单的提取一下。
msgApi = WXAPIFactory.createWXAPI(BrowserActi...
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)来源:作者:会编码的熊
该文章纪录了我在开发小程序支付过程中的具体流程
小程序认证后进入微信支付申请小程序的微信支付
填写企业信息对公账户并上传凭证后,微信支付会打一笔随机金额到对公账户,输入金额完成验证后,在线签署协议,这样整个微信支付的申请流程完成了。注意此处申请所填写的信息都需要真实且详细,设置小程序的密钥。
微信支付申请完,会发送微信支付商户号,商户平台用户名密码等信息到注册者邮箱。
申请微信支付成功后,登陆商户平台(pay.)进入账户中心,设置微信商户的API Key与下载证书
小程序的前端是使用微信提供的框架开发,但是后台依然是开发者自己的服务器。小程序发起的是 https 请求,意味着小程序开发者必须配置 https 服务器。配置 https 服务器之前,先要获取证书,证书可以向相关机构购买,腾讯云目前可以向用户提供免费的证书。
证书安装指引在这里查看:/document/product/400/4143
下载微信支付sdk,配置微信小程序信息与商户信息,放置证书到对应目录。调用微信申请支付JSAPI的方式生成一串验证信息如下:
appId:"wx3*******6"//小程序id
nonceStr:"qdpys6rdizbnpj12ahwvkf568a6c1sr9" //随机字符串
package:"prepay_id=wx2016***********3" //wx的预支付交易单
paySign:"8A7DC1A560B3B6DB0C656AC382D3E6F1"
signType:"MD5"
timeStamp:""
const wechatData = payRes.data.//wechatData就是上面的验证信息
console.log(wechatData);
wx.requestPayment({
'appId' : wechatData.appId,
'timeStamp': wechatData.timeStamp,
'nonceStr': wechatData.nonceStr,
'package': wechatData.package,
'signType': 'MD5',
'paySign': wechatData.paySign,
'success':function(res){
console.log(res);
console.log('success');
'fail':function(res){
console.log(res);
console.log('fail');
'complete': function(res){
console.log(res);console.log('complete');
console.log(2);
开启校验请求域名与AppID配置,点击预览使用真机测试,开发工具不会响应发起支付的接口。
阅读(...) 评论()作者:Jeffchen链接:/p/来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:Jeffchen链接:来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
小程序中微信支付的能力,是随着小程序的发布一并推出的,然而小程序文档里关于微信支付接口只有一个requestPayment函数的描述。
这个requestPayment函数确实是小程序前端唯一需要调用的函数,但是微信支付的成功接入实际远远不止这一个函数,对于没有接入过微信支付的开发者,会觉得一头雾水,完全没法下手。
本文阐述如何从零开始接入小程序支付,尤其适合那些没有微信支付接入经验的开发者。
1. 申请微信支付
小程序认证以后,可以在小程序后台,微信支付菜单栏,申请微信支付。
填写企业信息和对公账户,微信支付会打一笔随机金额到对公账户,输入金额完成验证后,在线签署迁移,即完成了微信支付的申请流程.。
微信支付申请完,会发送微信支付商户号,商户平台用户名密码等信息到注册者邮箱。
2. 准备工作
配置小程序密钥
小程序后台设置页,点击生成,管理员验证二维码后,会随机生成AppSecret。请妥善保管好Appsecret,不要明文存储于服务器,AppSecret用于和微信服务器交互。比如获取用户的openid接口就需要用到.
设置密钥和下载证书
用申请微信支付获得的用户名和密码,登录商户平台(),在账户中心,API安全中下载证书和设置密钥。
密钥是32位,设置以后需要妥善保管,因为无法查看密钥,所有微信支付相关的接口都会使用这个密钥加密。
2.3 配置Https服务器
小程序的前端是使用微信提供的框架开发,但是后台依然是开发者自己的服务器。小程序发起的是https请求,意味着小程序开发者必须配置https服务器。
配置https服务器之前,先要获取证书,证书可以向相关机构购买,腾讯云目前可以向用户提供免费的证书.
证书安装指引,可以参考这里:
3. 微信支付流程
微信支付有多种支付方式,包括刷卡支付,公众号支付,扫码支付,APP支付,所有微信支付的接口都可以在这里找到:
小程序是在微信里调起支付的,其实是公众号支付,关于公众号支付的详细文档可以这里找到:
所有公众号支付相关的链接都可以在此链接找到,开发者首先需要大概了解这些接口
小程序公众号支付的主要流程如下(本图只考虑了正常流程,异常流程参考公众号支付文档):
3.1 关于openid
上述流程中请求openid,用的是小程序最新api中的接口,开发者可以查看小程序的登录接口。
开发者从第三方服务器获得的openid,在统一下单的接口里面需要使用到.
3.2 关于小程序调起微信支付
上述流程中的小程序调起微信支付,用的是小程序微信支付接口wx.requestPayment,该接口的详细描述可以查看小程序的微信支付API。
这个接口中的package和timeStamp参数是从开发者的第三方服务器返回的,package是第三方服务器从统一下单接口回复中获得。
接口中其他的参数,appId,noceStr,signType以及paySign则由小程序这边存储或者计算而得。
其中paySign是签名,签名算法文档在这里:
整个公众号支付的主要流程基本都是在第三方服务器上实现,开发者需要熟读公众号支付文档,了解消息交互流程以及每个接口。
这里并没有描述正常微信支付必不可少的一些功能:异常处理,查询订单,发起退款,下载对账单等等。
小程序与JSSDK微信支付比较
JSSDK的微信支付接口是公众号里用JS调起公众号支付的方法,具体可以参考公众平台的文档。
可以看到,小程序和JSSDK的微信支付非常类似,这里比较一下2者的区别:
阅读(...) 评论()}

我要回帖

更多关于 微信小程序需要后端吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信