博客 (27)

登录微信公众平台,在“草稿箱”中依次点击“新的创作”,“写新图文”:

image.png

顶部选择“小程序”,在弹出窗中搜索小程序名称,以“浙里办”为例:

image.png

点击“获取更多页面路径”,并输入你的微信号

image.png


在手机上打开小程序,并打开你要复制路径的页面,点击右上角菜单,点击“复制页面路径”

image.png

得到一串类似下面格式的路径:

pages/zwfwBase/index.html?data=***


xoyozo 7 个月前
559

苹果安卓
微信小程序
微信小游戏
微信 H5未考证未考证
原生 App
原生 App 内嵌 H5未考证未考证
浏览器 H5未考证未考证

* 以上规则仅针对虚拟商品


“✘”是指:不能展现任何有购买、支付的功能、页面、按钮,即使实际上它们都不可使用;也不得引导至外部网站或 APP 来实现支付功能。


“虚拟商品”包括但不限于购买:会员、月卡、代金券、置顶服务。

“引导行为”包括但不限于引导至:App、公众号、H5、个人号、网站、安卓手机。

 

参:微信小程序 - 运营规范 - 虚拟支付行为

 

微信内规则大部分基于 iOS 规则。

任何不被允许的虚拟支付只要能够通过内购实现,那么都变得允许,只不过到手只剩 70%。

xoyozo 5 年前
3,410

ASP.NET Web API 返回 Unauthorized 401 未授权代码:

return Unauthorized(new AuthenticationHeaderValue("getUserInfo"));

响应的头部信息是这样的:

image.png

以微信小程序中获取 header 的 www-authenticate 为例,不同操作系统中获取的 key 是不一样的:


iOS:

image.png

Android:

image.png

微信开发者工具:

微信图片_20190716125001.png

所以,小程序端获取该值,暂时使用以下代码吧:

let www_authenticate;
if (!www_authenticate) {
	www_authenticate = res.header['Www-Authenticate']; // iOS
}
if (!www_authenticate) {
	www_authenticate = res.header['WWW-Authenticate']; // Android / 微信开发者工具
}
if (!www_authenticate) {
	www_authenticate = res.header['www-authenticate']; // ASP.NET Web API 原始输出
}
if (!www_authenticate) {
	www_authenticate = res.header['WWW-AUTHENTICATE']; // 其它情况
}
xoyozo 5 年前
6,292

微信支付商户可以直接注册,也可以由公众号、小程序、开放平台等开通。

直接注册时可勾选使用的公众号、小程序、APP、PC 网站等,并填写相应的 APPID。

填写资料提交审核,等待 1~2 工作日。

审核通过后签约,选择“手动提现”或“自动提现”,建议“手动提现”,原因如下:


用户付款、退款、企业付款等流程

以乐趣到家为例,

用户 A 提交搬家需要,并支付 100 元搬家费(其中的 10 元是平台抽成,90 元是服务者 B 的收入)。

那么 A 付款成功后,100 元打入商户的“未结算”中,在结算周期后扣除手续费变成“已结算”(若手续费 0.6% 则变成 99.4 元),如果商户开通了自动提现,则直接打入对公账户。

当 A 申请退款时,如果“未结算”资金充足,那么从“未结算”资金中退款给 A,如果不足,则从“可用余额”中退款(从商户角度来说应该是“企业付款”)。

若服务正常完成,则从可用余额中付款 90 元给 B。


可用余额(简称余额)是专用于支付的资金,其资金来源可以是充值或从“已结算”资金转入(前提是未开通自动提现)。

如果开通了“企业付款”,那么相关资金也是从余额中扣除的。


所以,退款(用户角度的“退款”)直接从“未结算”中扣是最划算的,只当“未结算”中资金不足时采用余额退款(用户角度的“退款”,商户角度的“企业付款”)。

由于退款(商户角度的“退款”)的前提是有相应的订单,所以上例中的 90 元支付给 B 时不能使用商户的退款功能,只能从余额支付(企业付款),而从“已结算”转到“余额”是最划算的,如从“已结算”到“对公账户”再充值到“余额”就会涉及开票缴税。


下面是如何关闭和再次开通“自动提现”。(注意:并非所有的商户都有此功能!据我所知,结算周期为 T+1 的有关闭功能,T+7 的不能关闭)

image.pngimage.png


以上系本人经验总结,仅供交流,不承担任何责任,如有错误敬请指正。QQ 940534113


xoyozo 5 年前
4,649

前提:

若需获取用户 unionid,则小程序必须已绑定到微信开放平台。


  1. 小程序调用 wx.login(),将 code 发送到开发者服务器

  2. 开发者服务器请求微信接口 code2Session,获得 session_keyopenid,有机会获得 unionid参 UnionID 机制说明)。因此无需任何用户授权即可获取 openid

  3. 访问须要已获取用户信息的页面时,可通过小程序端使用 button + getUserInfo 的方式请求用户授权

  4. 访问须要已获取手机号码的页面时,可通过小程序端使用 button + getPhoneNumber 的方式请求用户授权

  5. code2session、getUserInfo、getPhoneNumber 等接口返回数据存入数据库 dt_weapp_user

  6. 服务端的任何接口均返回口令状态包(含自定义会话口令等信息),小程序端应保存于 storage

  7. 请求 getUserInfo 后应判断 detail.errMsg 是否为 getUserInfo:ok,请求 getPhoneNumber 后应判断 detail.errMsg 是否为 getPhoneNumber:ok

  8. 授权窗口的弹出情况此文

  9. 口令状态包是用来传递到客户端用来标识用户唯一凭证的,包含字段:会话口令(自定义用户凭证)、会话口令有效时间(秒)、是否已获取 unionid 或昵称(视业务需求)、是否已获取手机号码uid(可选),以及其他用来标识业务身份字段。服务端可根据会话口令从数据库中获取该用户的所有已知信息。

    一般情况下,当已获取手机号码时,uid 必有值,否则,uid 必为空。因此 uid 不是必须传递到客户端的。

    通过 code2Session 获得的 session_key、以及 openidunionid手机号码等机密信息不允许包含在口令状态包中并缓存在客户端,客户端需要用到手机号码时单独调用接口获取。

  10. 若业务不要求以手机号码作为用户唯一标识,那么口令状态包中不需要包含是否已获取手机号码,仅 uid 即可。在客户端访问须要业务用户登录的页面时,也仅判断 uid 有值即可。


流程图:


微信小程序授权登录获取 unionid、用户信息流程.png


为更好地适应 2017.7.19 发布的《小程序内用户帐号登录规范调整和优化建议》开发者服务器提供的所有业务逻辑接口的返回值中都应包含口令状态包,约定有以下相关的返回值和处理动作(返回值按个人喜好来定):

口令状态接口返回ASP.NET Web API 语句处理动作
access_token 空或失效401 状态码return Unauthorized();login() + code2Session,获取 openid,生成 access_token
access_token 有效,但未获取 uniond 或用户信息401 状态码,http 头 WWW-Authenticate 中标注 getUserInforeturn Unauthorized(new AuthenticationHeaderValue("getUserInfo"));getUserInfo()
access_token 有效,但未获取手机号码(即未找到业务用户)401 状态码,http 头 WWW-Authenticate 中标注 getPhoneNumberreturn Unauthorized(new AuthenticationHeaderValue("getPhoneNumber"));getPhoneNumber()
xoyozo 5 年前
8,065

功能
适用场景
wx.switchTab跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。在应用内的某个页面上处理事务完毕,需要跳转到 tabbar 页面时使用
wx.reLaunch关闭所有页面,打开到应用内的某个页面。当在任何页面判断登录失效时跳转到授权登录页(当所有页面都需要登录后才能访问的情况)
wx.redirectTo关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。跳转到非 tabbar 页面,无返回按钮,目标页面必须具有跳转到小程序其它页面的功能
wx.navigateTo保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。跳转到非 tabbar 页面,有返回按钮
wx.navigateBack关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。返回


xoyozo 5 年前
3,072

未接受或拒绝过时发起已允许后再发起已拒绝后再发起
wx.getUserInfo
不弹,直接获取数据
wx.getPhoneNumber
wx.getLocation不弹,直接获取数据不弹,无法获取数据,必须引导 wx.getSetting

其它 scope 会在用到时补充……

“允许后再发起,不弹”的 scope 可在“关于XXX小程序”右上角三点按钮中的“设置”来设置是否允许。

xoyozo 5 年前
3,481

【推荐】临时口令和会话口令合二为一的流程(适合随时授权)


前提:

小程序已绑定到微信开放平台。


分两种场景:

场景一:仅需要获取 unionid,且不需要获取头像昵称等用户信息,且已经有很大部分用户仅通过 code2Session 就能获取到 unionid(如:已关注了绑定同一微信开放平台的其它公众号,参 UnionID 机制说明);

场景二:仅需要获取 unionid,或需要获取 unionid 及头像昵称等用户信息,或很大部分用户不能通过 code2Session 获取到 unionid。


场景一步骤:

  1. 小程序调用 wx.login(),将 code 发送到开发者服务器

  2. 开发者服务器请求微信接口 code2Session,获得 session_key、openid,有机会获得 unionid

  3. 若没有返回 unionid,尝试用 openid 从数据库中获取 unionid

  4. 如果数据库中没有找到对应的 unionid,告知小程序端使用 button + getUserInfo 的方式请求用户授权

  5. 授权允许(判断 detail.errMsg 是否为 getUserInfo:ok)则将加密数据传回开发者服务器进行解密,得到 unionid、头像、昵称等信息,保存到数据库

  6. 若授权拒绝,则无动作,用户再次点击 button 会重新弹起授权框

* 该流程仅部分用户的首次使用才要求授权。其它注意事项和流程细节见下方流程图。


场景二步骤:

  1. 小程序调用 wx.login(),将 code 发送到开发者服务器

  2. 开发者服务器请求微信接口 code2Session,获得 session_key、openid

  3. 尝试用 openid 从数据库中获取 unionid 和/或 用户信息

  4. 如果数据库中没有找到对应的 unionid 和/或 用户信息,告知小程序端使用 button + getUserInfo 的方式请求用户授权

  5. 授权允许(判断 detail.errMsg 是否为 getUserInfo:ok)则将加密数据传回开发者服务器进行解密,得到 unionid、头像、昵称等信息,保存到数据库

  6. 若授权拒绝,则无动作,用户再次点击 button 会重新弹起授权框

* 该流程仅每个用户的首次使用才要求授权。其它注意事项和流程细节见下方流程图。


上述两种场景的设计流程,只要数据库中已保存用户的 unionid(和/或 用户信息),都不再需要用户再次授权(即使在“设置”中关闭了“用户信息”授权,点击小程序右上角三点按钮,选择关于小程序,点击右上角的三点,选择设置)。


场景一流程图:

微信小程序授权登录获取 unionid(仅部分用户的首次使用才要求授权).png

场景二流程图:

微信小程序授权登录获取 unionid、头像昵称等(仅首次使用才要求授权).png


流程图中的“临时口令”仅用于关联“通过 code2Session 获得的 session_key”,并在用户授权后带回换取 session_key。原因是 session_key 是机密数据,不允许被传到小程序端。临时口令用完即删(设置表 dt__weapp_code2session 中相应记录的该字段为空)。


【推荐】临时口令和会话口令合二为一的流程(适合随时授权)

xoyozo 5 年前
10,464

微信小程序 login 后,在用 code 换 session 时,如果小程序绑定了微信开放平台,应该会返回 unionid。

文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/code2Session.html

但实际上部分用户仍然是没有 unionid 的,把上述接口返回的数据记录下来如:

image.png

仔细阅读官方 UnionID 机制说明,通过用户授权 wx.getUserInfo 才会保证有 unionid 返回,否则只会在“用户关注了绑定同一微信开放平台的同主体的公众号”等情况下才会返回 unionid。


确保获取 unionid 流程参此文

xoyozo 5 年前
6,538

Input string is not a valid interger. Path 'batteryLevel', line 1, position 447.

使用 uni-app 开发小程序的时候,获取系统信息(getSystemInfoSync())在 iPhone X 上报错,原因是电池电量值无法转换为 int 型。出现的情况是偶发性的,但一旦出现,一段时间内会一直出现(可能等电量值更新了才会正常吧)。不知道是 uni-app 的 bug 还是微信小程序的 bug。问了度娘和必应国际,暂时没有找到答案。

TIM图片20190314175428.jpg

xoyozo 5 年前
2,666