关于微信小程序
一、微信小程序的登陆
a) 微信小程序调用wx.login()方法,向后台传一个code作为参数。(可以用res.code获取)
b) 后台通过访问https://api.weixin.qq.com/sns/jscode2session?
b)appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code这个网址,并将对应的参数附带进去,grant_type=authorization_code这个参数不必修改
c) 后台访问对应的网址后会返回一个xml字符串,
{
"openid": "OPENID",
"session_key": "SESSIONKEY",
"unionid": "UNIONID"
}
//错误时返回JSON数据包(示例为Code无效)
{
"errcode": 40029,
"errmsg": "invalid code"
}
d) 这些信息保存起来,可以用Session保存,openid可以返回输出给前端保存起来,后面某些操作需要用,例如:支付接口(好像也可以通过保存的Session来获取,由于代码已写,没有修改)
e) 至此,登陆完成
二、获取用户信息
a) 调用wx.getUserInfo()方法,向后台传入一个Iv和一个encryptedData参数,encryptedData解密后是保存的内容,而iv是解密的偏移量
b) 后台获取到iv和encryptedData后,使用AES解密算法
- 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
- 对称解密的目标密文为 Base64_Decode(encryptedData)。
- 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
- 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
c) 前台调用的wx.getUserInfo()中一共有5个参数,
- userInfo:用户信息对象,不包含 openid 等敏感信息
- rawData:不包括敏感信息的原始数据字符串,用于计算签名(也就是里面有用户信息)
- signature:使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,参考文档 signature
- encryptedData:包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法
- iv: 加密算法的初始向量,详细见加密数据解密算法
d) 这个方法与getPhoneNumber传递的参数类似,getPhoneNumber也是传递iv与encryptedData,通过后台解密获取微信绑定的手机号
三、微信小程序的支付
a) 先是微信支付的流程图
b) 前台先将订单的信息发送到后台
c) 后台通过一下参数,标有**的是选传
- 服务商id(appid):微信分配的公总号id
- 商户号(mch_id):微信支付分配的商户号
- 小程序的appid(sub_appid):当前起支付的小程序的appid
- 子商户号(sub_mch_id):微信分配的子商户号
- ** 设备号(device_info):终端设备号(门店号或者收银设备ID),注意:PC网页或公众号内支付请传”WEB”
- 随机字符串(nonce_str):随机字符串,不长于32位。
- 签名(sign):签名,祥见签名算法
- ** 签名类型(sign_type):签名类型,目前支持HMAC-SHA256和MD5,默认为MD5
- 商品描述(body):商品简单描述,该字段须严格按照规范传递
- ** 商品详情(detail):单品优惠字段
- ** 附加数据(attach):附加数据,在查询API和支付通知中原样返回。该字段主要用于商户携带订单的自定义数据
- 12商品订单号(out_trade):商户系统内部的订单号。32个字符内,可包含字母
- ** 货币类型(fee_type):符合ISO 4217标准的三位字母代码,默认人民币:CNY
- 总金额(total_fee):订单总金额,单位为分
- 终端id(spbill_create_ip):APP和网页支付提交童虎的ip,Native支付调用微信支付API的机器IP
- ** 交易起始时间(time_start):订单生成时间,格式为yyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010
- ** 交易结束时间(time_expire):订单失效时间,格式与上面一样
- ** 商品标记(goods_tag):商品标记,代金券或立减优惠功能的参数 *选传
- 通知地址(notify_url):接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数
- 交易类型(trade_type):小程序取值如下:JSAPI
- ** 指定支付方式(limit_pay):no_credit—指定不能使用信用卡支付
- 用户标识(openid): trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,openid通过登录获取 (***注意:在商户版小程序支付中,这个参数可以不传,商户版因为sub_appid是必传字段,通过openid标签传入值发过去,会报错appid与openid不匹配,但需要传sub_openid。)
- 用户子标识(sub_openid):trade_type=JSAPI,此参数必传,用户在子商户appid下的唯一标识,openid与sub_openod可以选传其中之一,如果选择传sub_openid,则必须穿sub_appid,下单前需要调用登陆接口,获取openid
d) 首先将如上关键参数传到后台,后台向微信后台发送一个POST请求,请求地址为:https://api.mch.weixin.qq.com/pay/unifiedorder,将参数按照ASCII码表排序,拼接上自己商户微信后台设置的key,进行MD5加密转成大写,将参数换成xml附加到请求中发过去,某些中文数据需要换成utf-8编码
e) 对方会返回成功或失败的信息,成功返回的其中有prepay_id和其他的信息,将appid=xxx&nonceStr=xxx&package=prepay_id=xxx&signType=xxx×tamp=xxx&key=xxx,等信息再次进行MD5加密转换为大写后,输出到前端,注意将时间戳保留一起输出到前端
f) 前端调起支付需要的参数:
timeStamp(时间戳,后台保留输出给前端)
nonceStr(后台对prepay_id等数据加密时用到的随机字符,后台保留输出给前端)
package(后台发起支付成功后的prepay_id,后台保留输出给前端)
signType(签名算法。暂支持MD5)
paySign(签名,是上一步那6个参数MD5加密转为大写后的字符串,后台保留输出给前端)
g) 以上参数传入正确后前端调用微信小程序支付后会出现二维码支付,支付若不成功,或没有记录,前端可以打log查看问题,最好检查参数是否正确,发起支付的参数,必须与生成paySign时的参数一致
最后:如果代码能力够强,完全可以全在微信小程序前端中完成整个支付流程,但不可避免的会将商户后台的关键数据暴露出来,例如:appid,商户id,子商户id,与商户后台的key
这只是一个新手的一点记录!!

浙公网安备 33010602011771号