微信小程式支付及退款整體流程

2022-02-23 17:32:11 字數 4076 閱讀 2756

wx.requestpayment(,

fail (res)

})

文件也寫的很清楚,不細說,主要看下面這個流程

1、小程式內呼叫登入介面,獲取到使用者的openid,api參見公共api【小程式登入api】

2、商戶server呼叫支付統一下單,api參見公共api【統一下單api】

3、商戶server呼叫再次簽名,api參見公共api【再次簽名】

4、商戶server接收支付通知,api參見公共api【支付結果通知api】

5、商戶server查詢支付結果,api參見公共api【查詢訂單api】

主要是因為下面的統一下單api裡的引數配置:

2、統一下單api、二次簽名api返回引數

例項**如下

// 統一下單

let unifiedorder = async (params = {}, ctx) => ` // 商戶號

bodydata += `$` // 商品描述

bodydata += `$` // 隨機字串

bodydata += `$` // 支付成功的**位址

bodydata += `$` // 使用者標識(openid,jsapi方式支付時必需傳該引數)

bodydata += `$` // 商戶訂單號

bodydata += `$` // 終端ip

bodydata += `$` // 總金額 單位為分

bodydata += 'jsapi' // 交易型別 小程式取值:jsapi

// 簽名(根據上面這些引數,有個簽名演算法,文件裡也有描述)

var sign = wxconfig.paysignjsapi(

body,

wxconfig.mch_id,

nonce_str,

notify_url,

params.openid,

out_trade_no,

params.ip,

total_fee

);bodydata += '' + sign + ''

bodydata += ''

var urlstr = ''

let option=

let result = await rp(option)

let returnvalue = {}

parsestring(result, function(err,result)

} else}})

}

const cryptomo = require('crypto') // md5演算法

const wxconfig =

if(day < 10)

if(hour < 10)

if(minute < 10)

if(second < 10)

if (msecond < 10) else if(msecond >= 10 && msecond < 100)

let currentdate = string(year) + string(mouth) + string(day) + string(hour) + string(minute) + string(second) + string(msecond);

return currentdate

},//獲取隨機字串

getnoncestr(),

// 統一下單簽名

let ret =

let str = this.raw(ret, true)

str = str + '&key=' + wxconfig.mch_key

let md5str = cryptomo.createhash('md5').update(str, 'utf-8').digest('hex')

md5str = md5str.touppercase()

return md5str

},raw (args, lower)

keys.foreach(key => )

let str = ''

for(let k in newargs)

str = str.substr(1)

return str

},//小程式支付簽名

let ret =

let str = this.raw(ret)

str = str + '&key=' + this.mch_key

let md5str = cryptomo.createhash('md5').update(str, 'utf-8').digest('hex')

md5str = md5str.touppercase()

return md5str

},// 校驗支付成功**簽名

validpaybacksign (xml)

let _paysign = xml.sign[0]

for (let key in xml)

let str = this.raw(ret, true)

str = str + '&key=' + wxconfig.mch_key

let md5str = cryptomo.createhash('md5').update(str, 'utf-8').digest('hex')

md5str = md5str.touppercase()

return _paysign === md5str

},// 確認退款簽名

let ret =

let str = this.raw(ret, true)

str = str + '&key='+wxconfig.mch_key

let md5str = cryptomo.createhash('md5').update(str, 'utf-8').digest('hex')

md5str = md5str.touppercase()

return md5str

}}

這個配置項裡的就是raw方法得注意下,有個區分,有的簽名是key值全小寫,有的簽名就是支付二次簽名校驗的時候,key值是要保持駝峰,所以加了點區分。

從上面**也可以看出流程:

3、支付成功結果通知

const parsestring = require('xml2js').parsestring // xml轉js物件

let wxpayback = async (ctx, next) => )

}let payback = async (xml, ctx) =>

})if (out_order && (out_order.orderpay * 100) - total_free === 0 && out_order.orderstate === 1) ,

})// emittosocket(total_fee)

return ctx.response.body = ` `}}

} return ctx.response.body = ` `

}

校驗成功之後,修改訂單表對應資料的狀態即可。

申請退款其實沒什麼說的,就是使用者側申請退款,然後更改使用者側訂單的狀態,主要說一下商家確認退款給買家的流程。

特別需要注意的是:請求需要雙向證書。 詳見證書使用

例項**:

// 確認退款

let confirmrefund = async (ctx, next) =>

let urlstr = ''

let option=

let result = await rp(option)

parsestring(result, function(err, result)

} else}})

}let refundback = async (orderid) => ,

})let orderfoods = await model.foodsorder.findall(

})orderfoods.foreach(food => )

}

可以看到:隨機字串 nonce_str,商戶退款單號 out_refund_no,我們用的是同乙個隨機串。

微信小程式支付及退款流程詳解

支付主要分為幾個步驟 前端攜帶支付需要的資料 商品id,購買數量等 發起支付請求 前端進行支付動作 下面就詳細的說明一下各個步驟的具體實現。1.前端請求支付 後端接收到前端傳送的支付請求後,可以進行一下相關驗證,例如判斷一下使用者有沒有問題,支付金額對不對等等。使用者標識 openid。也就是使用者...

微信小程式支付及退款流程詳解

一.支付 支付主要分為幾個步驟 前端攜帶支付需要的資料 商品id,購買數量等 發起支付請求 前端進行支付動作 1.前端請求支付 後端接收到前端傳送的支付請求後,可以進行一下相關驗證,例如判斷一下使用者有沒有問題,支付金額對不對等等。使用者標識 openid。也就是使用者的小程式標識,在我上篇部落格中...

微信小程式支付和退款流程下

微信小程式支付及退款流程詳解 上 中講了微信支付的相關流程。在理清思路後,流程還是比較清晰和簡單的。重點在於需要注意一些細節問題,例如資料格式,加密方法等。下面說一下微信小程式退款的具體實現 小程式退款的流程和付款相似,但有一些細節上的不同。首先退款的步驟通常如下 使用者前端點選退款按鈕後,後端接收...