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