关于微信小程序

一、微信小程序的登陆

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解密算法

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
  4. 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

c)         前台调用的wx.getUserInfo()中一共有5个参数,

  1. userInfo:用户信息对象,不包含 openid 等敏感信息
  2. rawData:不包括敏感信息的原始数据字符串,用于计算签名(也就是里面有用户信息)
  3. signature:使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,参考文档 signature
  4. encryptedData:包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法
  5. iv: 加密算法的初始向量,详细见加密数据解密算法

d)         这个方法与getPhoneNumber传递的参数类似,getPhoneNumber也是传递iv与encryptedData,通过后台解密获取微信绑定的手机号

三、微信小程序的支付

a)         先是微信支付的流程图

 

b)         前台先将订单的信息发送到后台

c)         后台通过一下参数,标有**的是选传

  1. 服务商id(appid):微信分配的公总号id
  2. 商户号(mch_id):微信支付分配的商户号
  3. 小程序的appid(sub_appid):当前起支付的小程序的appid
  4. 子商户号(sub_mch_id):微信分配的子商户号
  5. ** 设备号(device_info):终端设备号(门店号或者收银设备ID),注意:PC网页或公众号内支付请传”WEB” 
  6. 随机字符串(nonce_str):随机字符串,不长于32位。
  7. 签名(sign):签名,祥见签名算法
  8. ** 签名类型(sign_type):签名类型,目前支持HMAC-SHA256和MD5,默认为MD5                        
  9. 商品描述(body):商品简单描述,该字段须严格按照规范传递
  10. ** 商品详情(detail):单品优惠字段
  11. ** 附加数据(attach):附加数据,在查询API和支付通知中原样返回。该字段主要用于商户携带订单的自定义数据          
  12. 12商品订单号(out_trade):商户系统内部的订单号。32个字符内,可包含字母
  13. ** 货币类型(fee_type):符合ISO 4217标准的三位字母代码,默认人民币:CNY
  14. 总金额(total_fee):订单总金额,单位为分
  15. 终端id(spbill_create_ip):APP和网页支付提交童虎的ip,Native支付调用微信支付API的机器IP
  16. ** 交易起始时间(time_start):订单生成时间,格式为yyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010             
  17. ** 交易结束时间(time_expire):订单失效时间,格式与上面一样               
  18. ** 商品标记(goods_tag):商品标记,代金券或立减优惠功能的参数         *选传
  19. 通知地址(notify_url):接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数
  20. 交易类型(trade_type):小程序取值如下:JSAPI
  21. ** 指定支付方式(limit_pay):no_credit—指定不能使用信用卡支付            
  22. 用户标识(openid): trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,openid通过登录获取 (***注意:在商户版小程序支付中,这个参数可以不传,商户版因为sub_appid是必传字段,通过openid标签传入值发过去,会报错appid与openid不匹配,但需要传sub_openid。)
  23. 用户子标识(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&timestamp=xxx&key=xxx,等信息再次进行MD5加密转换为大写后,输出到前端,注意将时间戳保留一起输出到前端

f)          前端调起支付需要的参数:

timeStamp(时间戳,后台保留输出给前端)

nonceStr(后台对prepay_id等数据加密时用到的随机字符,后台保留输出给前端)

package(后台发起支付成功后的prepay_id,后台保留输出给前端)

signType(签名算法。暂支持MD5)

paySign(签名,是上一步那6个参数MD5加密转为大写后的字符串,后台保留输出给前端)

g)         以上参数传入正确后前端调用微信小程序支付后会出现二维码支付,支付若不成功,或没有记录,前端可以打log查看问题,最好检查参数是否正确,发起支付的参数,必须与生成paySign时的参数一致

 

最后:如果代码能力够强,完全可以全在微信小程序前端中完成整个支付流程,但不可避免的会将商户后台的关键数据暴露出来,例如:appid,商户id,子商户id,与商户后台的key

 

这只是一个新手的一点记录!!

posted @ 2017-12-25 14:56  落叶知秋意  阅读(820)  评论(0)    收藏  举报