hi,大家好欢迎来到大熊实验室。我们平时支付,宝支付、微信支付用的都很多,除了我们普通人真的就单纯支付的情况下,如果我们想深究一点。或者说我们作为开发者,微信支付(ps:支付宝支付也是一样的)它到底是怎么一个过程呢?那我们来探讨一下。

我们现如今使用手机支付主要有支付宝和微信支付。有哪几种实际情况呢?第一种是你打开手机扫描一个二维码然后付钱,第二种是应用内部自己就弹出支付输入密码的窗口。那这一切是怎么发生的呢?
我们分成两方来阐述:
普通用户方:扫码支付或者直接在弹框中输入密码确定支付。
商户方:去微信支付官网注册账号,以企业的信息才能注册,要营业执照之类的企业信息。当注册好以后就会获取到商户号、密钥什么的一堆调用支付是需要使用的敏感数据,然后利用这些数据发起网络请求就可以完成支付了。
是不是心里在骂,什么特么的东西啊,说了和没说一样。
我们开始深入
我们不管是在小程序或者普通H5页面上,又或者扫描小商店老板的二维码时,都会跳出输入密码的输入框,然后点击确认钱就付出去了。看似神奇,原理是什么呢。

当用户点击按钮以后,触发的方法将会发送商品信息到后端接口。基本上数据也就包括了商品的名称价格等基本信息。
当我们后端服务器拿到参数以后核心就来了。那就是——向微信统一下单。一般正常人都有疑问。
什么?用户在我们系统里下单以后,居然还要向微信下单,下什么单呢?
其实就可以直接理解成因为要调用微信支付,所以必须向微信下单,因为支付以后在微信的订单里是有数据的,我们自己的系统知识存储一下订单信息而已。不信你看微信支付的卡片点开,里面是有很多信息的。

当我们向微信下单时,微信的系统里要什么的参数呢?这就需要参考微信支付的开发文档,微信的支付文档有H5、小程序、APP不同的支付方式的文档。我们以H5支付分析。

文档里最已经写得很清楚了,什么参数必须要传什么可以不必要传。

公众号ID就是申请了公众号以后能在后台查询到的公众号ID,商户号是之前申请成功后的在微信支付后台能查到的商户号。向微信统一下单的时候最重要也是问题最多的就是签名。
扯一下为什么需要签名,数据在网络上传输可能被其他人篡改,试想一下,如果你买的东西100块,数据在网络上传输被修改以后只实际付1块钱订单就成功了,那商家岂不是亏死。所以数据要进行签名,签名的基本思路都是这样:我们去平台方注册,然后生成一个key,在提交数据的时候用这个key通过算法,一般md5或者hmac等,将参数拼接一下利用key进行加密得到加密后的字符串,然后将加密后的字符串加在参数中传输给平台,平台根据你的key依照相同的方式加密然后对比你传的key和算出来的是不是一样,如果一样那就证明数据没被篡改过。
当我们向微信下单以后,微信服务器会给我们返回一些数据。

返回的数据中心我们将会直接使用prepay_id,我们将数据处理好后再响应给前端页面。

当我们的前端接收到这些参数,就可以使用微信提供的sdk了,因为微信的SDK要起调微信支付需要必要的几个参数。

当我们设置好参数调用微信的sdk,那就发生了接下来的一幕

到了这一步其实都是微信他们自己处理好了,我们自己不用去做处理了。
当用户付钱后我们自己的系统怎么知道用户是否付钱了呢?
事实上当用户付钱后微信自身服务器处理没问题以后微信服务器会用https的形式请求我们的服务器,并且携带响应的参数,当我们的系统接收到微信的服务器的请求以后那就可以知道用户支付成功了。
为什么你能见到的所有涉及到支付的系统中都是https呢?虽然http不需要证书使用起来简单,但是有个严重的问题。我们使用一般的抓包工具,比如wireshark就能抓到实际的请求内容也可以通过其他方式进行参数的篡改,而使用https就能进一步加强网络请求的安全性了。
那微信怎么知道要调用我们什么地址呢?这其实是我们在向微信统一下单时传输给微信的