小程序微信支付開發流程記錄

我所在公司須要開發一款商城小程序,裏面須要用到微信支付,我負責裏面的下單功能,從小程序端到後臺的支付流程都是我本身開發的,因爲咱們組沒有人有開發微信支付的經驗,不少東西都還不怎麼明白,可是沒辦法,只能我本身琢磨,寫完以後總感受有bug,可是不知道該怎麼改才合適,前先後後踩了很多的坑,本身有時間也研究了一下,改動了好幾回以後,我以爲目前的版本是最順暢,安全性也是最高的,我把目前的作法流程記錄一下,供他人蔘考。php

  1. 首先要拿到收款的微信商戶號和支付祕鑰
  2. 確保拿到用戶的openid,獲取用戶的openid的流程大體是,在微信端使用wx.login獲取到code,將code傳到服務器換取openid,具體的流程可去官方文檔查看獲取openid
  3. 建立一個代付款的訂單,獲得該訂單的單號
  4. 在服務端調用微信支付的統一下單接口微信支付統一下單,( 調用預下單接口的時候,要傳入一個正確的通知地址,字段名稱是notify_url,這個地址是咱們本身寫的接口地址,用於接收微信支付結果通知,而後更新訂單狀態 ),進行預下單以後,獲得一個prepay_id
  5. 用獲得的prepay_id在js裏調用發起支付微信小程序支付
  6. 支付結果,微信會經過服務端通知到統一下單的時候的通知地址,當收到微信支付結果通知以後,須要對接收到的信息進行簽名驗證,確保驗證經過了,才更新訂單的狀態。

踩坑集合:html

  1. 最開始的版本是直接在小程序微信支付的js的success回調裏,接收到了支付成功以後,再在js裏調用修改訂單狀態的接口,這樣作其實很不安全,由於別人一旦拿到小程序的源碼,就能夠直接跳過微信支付,直接調用修改訂單付款狀態的接口了,並且,若是客戶在微信支付完成以後,沒有點完成按鈕,也不會進入js的success回調裏面,因此須要經過服務端的通知接口,接收到支付結果通知以後,再在服務端修改訂單付款狀態,這樣就沒有問題了。
  2. 屢次通知付款結果的問題。付款結果通知,微信會發起屢次,一開始的時候,我發現同一個訂單會有多條同樣的付款日誌,沒找到問題,後面看了微信支付的官方文檔以後,才知道,爲了保證能接收到支付的結果,同一條訂單的支付結果會通知屢次,須要開發者本身進行處理。
  3. 支付結果通知的安全性問題。由於支付結果通知接收的地址是對外開放的,因此一旦地址泄露出去,有可能會被有心人調用,按照必定的參數格式調用,就能修改訂單的付款狀態,形成假的支付通知。因此在收到支付結果通知的時候,須要對接收到的數據按照簽名的規則進行簽名校驗,校驗經過了,才更新訂單的付款狀態。簽名須要用到支付祕鑰,只要祕鑰沒有泄露,就不會有安全性問題。
  4. 微信支付的祕鑰不要讀到前端。由於咱們的接口分了好多地方讀取,因此在進行微信統一下單的時候,有把支付祕鑰在小程序的js頁面裏讀出來,再在js裏調統一下單的接口,從安全性的角度上來看,這樣不夠安全,支付祕鑰的讀取和傳輸應該只在後端操做,不該該讀到前端,固然讀到前端也沒有問題,可是能夠改的話最好改一下。

附:微信JSAPI支付流程
微信JSAPI支付流程和小程序的支付流程基本一致,須要注意兩點:前端

  1. 須要在微信商戶平臺配置支付目錄,只有跳轉到了支付目錄的地址,才能發起微信支付。
  2. 網頁須要獲取openid須要進行一次頁面跳轉,須要用戶對網頁受權以後,才能獲取到code,獲取到code以後,再使用code獲取到openid,再進行統一下單預支付,其餘流程就和小程序一致。由於在網頁裏要獲取到openid必需要進行一次頁面跳轉才能獲取到openid,因此我建議能夠在訂單確認頁面,確認好信息以後,先下好待付款的訂單,獲得訂單號以後再跳轉,跳轉到支付頁面的時候,進行獲取openid的操做,再進行下面的操做便可。

獲取openid參考微信網頁受權小程序

相關文章
相關標籤/搜索