1 Star 1 Fork 0

Arvid / docs

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
微信小程序.md 21.60 KB
一键复制 编辑 原始数据 按行查看 历史
Arvid 提交于 2022-08-03 18:54 . update

微信小程序

常用API

api 说明 使用
wx.getSystemInfoSync() 异步获取系统信息 wx.getSystemInfo({ success (res) { console.log(res.model) console.log(res.pixelRatio) console.log(res.windowWidth) console.log(res.windowHeight) console.log(res.language) console.log(res.version) console.log(res.platform) } }) try { const res = wx.getSystemInfoSync() console.log(res.model) console.log(res.pixelRatio) console.log(res.windowWidth) console.log(res.windowHeight) console.log(res.language) console.log(res.version) console.log(res.platform) } catch (e) { // Do something when catch error }
wx.getSystemInfo(Object object) 同步过去系统信息
wx.redirectTo(Object object) 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。 url:需要跳转的路径,页面A向页面B跳转成功后,页面A立即释放
wx.navigateTo(Object object) 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层。 url:需要跳转的路径,页面A向页面B跳转成功后,页面A不会释放,点击返回按钮可以返回,小程序页面栈最多10层
wx.navigateBack(Object object) 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。 wx.navigateBack({ delta: 1 }) //页面返回上一级
wx.reLaunch(Object object) 关闭所有页面,打开到应用内的某个页面 wx.reLaunch({ url: 'test?id=1' })
wx.showToast(Object object) 显示消息提示框 wx.showToast({ title: '登录成功!', icon: 'success', duration: 2000, })

组件

组件 简介 使用方法
web-view> 承载网页的容器。会自动铺满整个小程序页面,个人类型的小程序暂不支持使用 web-view>
view> 视图容器,相当于html里的标签
swiper> 滑块视图容器。其中只可放置swiper-item组件,否则会导致未定义的行为。 swiper-item> swiper-item> swiper-item> swiper>
swiper-item> 滑块视图容器。其中只可放置swiper-item组件,否则会导致未定义的行为
text> 文本 text 组件内只支持 text 嵌套。
picker> 从底部弹起的滚动选择器。 {{enddate}} view> picker> mode:picke类型,此处作时间选中组件使用 header-text:选择器标题,目前仅安卓可用 disabled:是否禁用 bindcancel:取消绑定时触发
input> 输入框。该组件是原生组件,使用时请注意相关限制 value:输入框的初始内容 type:input的类型 password:是否是密码类型 placeholder:占位符 disabled:是否禁用 maxlength:最大输入长度,设置为 -1 的时候不限制最大长度 bindinput:输入时触发 bindfocus:聚焦时触发 bindblur:失焦时触发

开放能力

第一步:使用button组件;设置open-type属性值为getPhoneNumber,设置bindgetphonenumber事件的方法

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>

第二步:通过上一步绑定的方法getPhoneNumber获取iv和encryptedData,此时还缺少session_key

getPhoneNumber (e) {
    console.log(e.detail.iv)            //加密算法的初始向量
    console.log(e.detail.encryptedData) //包括敏感数据在内的完整用户信息的加密数据
  }

第三步:使用wx.login获取code

wx.login({
      success(res) {
        if (res.code) {
          app.globalData.code = res.code //res.code重点为了获取session_key
        } else {
        }
      }
    })

第四步:获取到code之后,传入自己的API接口中获取session_key

	//https://api.weixin.qq.com/sns/jscode2session  微信官方API
    //需要三个参数:appid:小程序ID(AppID);secret:小程序密钥(AppSecret);grant_type:授权类型,此处只需填写 authorization_code;js_code:通过 wx.login 接口获得临时登录凭证 code
    Public Function GetSessionKey() As Boolean
        Dim relust As Boolean = False
        Try
            Dim urlStr As String = "https://api.weixin.qq.com/sns/jscode2session"
            Dim currStr As String = "appid=" & iWeiChatInfo.appid & "&secret=" & iWeiChatInfo.secret & "&js_code=" & iWeiChatInfo.js_code & "&grant_type=" + iWeiChatInfo.grant_type
            Dim jsonStr As String = httpHelper.GetData(urlStr, currStr)
            Dim ijson As New JavaScriptSerializer
            iSessionKeyInfo = ijson.Deserialize(Of SessionKeyInfo)(jsonStr)
        Catch ex As Exception
        End Try
    End Function
Imports System.Net
Imports System.IO
Imports System.Text
Public Class httpHelper
    Public Shared Function GetData(ByVal url As String, ByVal data As String) As String
        Dim request As HttpWebRequest = WebRequest.Create(url + "?" + data)
        request.Method = "GET"
        Dim sr As StreamReader = New StreamReader(request.GetResponse().GetResponseStream)
        Return sr.ReadToEnd
    End Function
    Public Shared Function PostData(ByVal url As String, ByVal data As String) As String
        ServicePointManager.Expect100Continue = False
        Dim request As HttpWebRequest = WebRequest.Create(url)
        'Post请求方式
        request.Method = "POST"
        '内容类型
        request.ContentType = "application/x-www-form-urlencoded"
        '将URL编码后的字符串转化为字节
        Dim encoding As New UTF8Encoding()
        Dim bys As Byte() = encoding.GetBytes(data)
        '设置请求的 ContentLength 
        request.ContentLength = bys.Length
        '获得请 求流
        Dim newStream As Stream = request.GetRequestStream()
        newStream.Write(bys, 0, bys.Length)
        newStream.Close()
        '获得响应流
        Dim sr As StreamReader = New StreamReader(request.GetResponse().GetResponseStream)
        Return sr.ReadToEnd
    End Function
End Class

第五步:此时iv、encryptedData、session_key三个参数我们有了值使用Encrypt.DecryptAesForWeChart方法进行AES解密

Public Class Encrypt
    Public Shared Function DecryptAesForWeChart(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String    '使用标准AES对称解密 
        Try
            Dim aes As New System.Security.Cryptography.AesCryptoServiceProvider 'DES算法  
            Dim buffer As Byte() = Convert.FromBase64String(SourceStr)
            aes.Key = Convert.FromBase64String(myKey)
            aes.IV = Convert.FromBase64String(myIV)
            aes.Mode = System.Security.Cryptography.CipherMode.CBC
            aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7
            Dim ms As New System.IO.MemoryStream(buffer)
            Dim cs As New System.Security.Cryptography.CryptoStream(ms, aes.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Read)
            Dim sr As New System.IO.StreamReader(cs)
            Return sr.ReadToEnd()
        Catch ex As Exception
            Return ""
        End Try
    End Function
    
    Public Shared Function EncryptDes(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String '使用的DES对称加密
        Try
            Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES算法  
            Dim inputByteArray As Byte()
            inputByteArray = System.Text.Encoding.Default.GetBytes(SourceStr)
            des.Key = System.Text.Encoding.UTF8.GetBytes(myKey) 'myKey DES用8个字符,TripleDES要24个字符  
            des.IV = System.Text.Encoding.UTF8.GetBytes(myIV) 'myIV DES用8个字符,TripleDES要24个字符  
            Dim ms As New System.IO.MemoryStream
            Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)
            Dim sw As New System.IO.StreamWriter(cs)
            sw.Write(SourceStr)
            sw.Flush()
            cs.FlushFinalBlock()
            ms.Flush()
            EncryptDes = Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
        Catch ex As Exception
            Return ""
        End Try
    End Function

    Public Shared Function DecryptDes(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String    '使用标准DES对称解密 
        Try
            Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES算法  
            des.Key = System.Text.Encoding.UTF8.GetBytes(myKey) 'myKey DES用8个字符,TripleDES要24个字符  
            des.IV = System.Text.Encoding.UTF8.GetBytes(myIV) 'myIV DES用8个字符,TripleDES要24个字符  
            Dim buffer As Byte() = Convert.FromBase64String(SourceStr)
            Dim ms As New System.IO.MemoryStream(buffer)
            Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Read)
            Dim sr As New System.IO.StreamReader(cs)
            Return sr.ReadToEnd()
        Catch ex As Exception
            Return ""
        End Try
    End Function
End Class

上面是VB实现,后面通过C#,前面具体代码我就不展示了,展示一下解密的

    public class Encrypt
    {
        public static T DecryptAes<T>(string eStr, string key, string iv)
        {
            T result;
            using (AesManaged myAes = new AesManaged())
            {
                myAes.Key = Convert.FromBase64String(key);
                myAes.IV = Convert.FromBase64String(iv);
                var EncryptTxt = Convert.FromBase64String(eStr);
                string roundtrip = Encrypt.DecryptStringFromBytes_Aes(EncryptTxt, myAes.Key, myAes.IV);
                result = JsonConvert.DeserializeObject<T>(roundtrip);
            }
            return result;
        }
        #region AES
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="plainText"></param>
        /// <param name="Key"></param>
        /// <param name="IV"></param>
        /// <returns></returns>
        private static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");
            byte[] encrypted;

            // Create an AesManaged object
            // with the specified key and IV.
            using (AesManaged aesAlg = new AesManaged())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create an encryptor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            //Write all data to the stream.
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }

            // Return the encrypted bytes from the memory stream.
            return encrypted;
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="cipherText"></param>
        /// <param name="Key"></param>
        /// <param name="IV"></param>
        /// <returns></returns>
        private static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
        {


            // Check arguments.
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            // Declare the string used to hold
            // the decrypted text.
            string plaintext = null;

            // Create an AesManaged object
            // with the specified key and IV.
            using (AesManaged aesAlg = new AesManaged())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decryptor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for decryption.
                using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {

                            // Read the decrypted bytes from the decrypting stream
                            // and place them in a string.
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }
            }

            return plaintext;
        }
        #endregion
    }
功能 介绍 使用方法
获取手机号 获取微信用户绑定的手机号,需先调用wx.login接口。 因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。 注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。 wx.login获取的code有效期为5分钟,5分钟后需要重新获取。 button> 上面是获取手机号五部曲
转发 通过给 button 组件设置属性 open-type="share",可以在用户点击按钮后触发 Page.onShareAppMessage 事件, 应用分享button>
意见反馈 打开“意见反馈”页面,用户可提交反馈内容并上传日志,开发者可以登录小程序管理后台后进入左侧菜单“客服反馈”页面获取到反馈内容 问题反馈button>

路由

方法 介绍
wx.redirectTo(Object object) 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。 url:需要跳转的路径,页面A向页面B跳转成功后,页面A立即释放
wx.navigateTo(Object object) 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层。 url:需要跳转的路径,页面A向页面B跳转成功后,页面A不会释放,点击返回按钮可以返回,小程序页面栈最多10层
wx.navigateBack(Object object) 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。 wx.navigateBack({ delta: 1 }) //页面返回上一级
wx.reLaunch(Object object) 关闭所有页面,打开到应用内的某个页面 wx.reLaunch({ url: 'test?id=1' })

订阅消息

顾名思义,订阅消息主要是在订阅上,用户在不勾选始终保持的情况下,用户订阅一次信息,服务端可以发送一次,点击按钮也好,其他方式触发消息订阅也好,每次触发,用户可接收消息+1。

用户勾选始终保持,并不代表服务端消息可以一直发送,那微信为什么又要做这个始终保持呢?始终保持的目的是为了用户可以在使用小程序接收订阅消息时,不弹出提醒,切默认允许,此时用户可接收消息+1。

总结,用户订阅消息时有次数限制的,也就是用户触发多少次,就可以接收多少次。不管是否勾选始终订阅。

解决方案:

  1. 理性解决:设计相关结构表,存储用户订阅消息模板次数。触发时检测用户如果没有可接收次数,重新调用订阅消息,让消息加+1。
  2. 贪婪解决:在打开程序时,在多处点地方加上订阅消息,多次邀请用户授权,从而达到用户需求次数。
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wuxinheng/docs.git
git@gitee.com:wuxinheng/docs.git
wuxinheng
docs
docs
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891