? ? ? 先說點題外話,從學(xué)習(xí)nodejs到基本獨立完成微信小程序后臺開發(fā),我只用了2個星期,基本是邊學(xué)邊開發(fā),第一個星期學(xué)習(xí)nodejs,第二個星期開發(fā),然后抽幾天和前端小伙伴聯(lián)調(diào)。寫了兩年的android開發(fā),也一直想多學(xué)點其他計算機(jī)語言,嘗試其他業(yè)務(wù)開發(fā),提高下自己的能力(逼格),現(xiàn)終于有機(jī)會可以學(xué)習(xí),這里,還是的感謝我老大。
? ? ? 對于微信小程序的開發(fā),后臺其實就主要兩點需要對接到微信服務(wù)器:1.支付接口相關(guān),2.客服接口相關(guān)。
一.支付接口相關(guān)

1.https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1
a.用戶通過小程序向商戶服務(wù)器發(fā)起支付請求,商戶服務(wù)器通過微信接口(POST https://api.mch.weixin.qq.com/pay/unifiedorder)請求獲取到prepay_id,并將支付參數(shù)(sign,nonce_str等)一并返回給小程序
b.小程序收到支付參數(shù)后,調(diào)起微信支付面板進(jìn)行支付
c.支付成功后,微信服務(wù)器會將消息推送到回調(diào)接口,推送所帶參數(shù)包含支付訂單號,服務(wù)器可以根據(jù)該訂單號判斷支付狀態(tài)
2.服務(wù)器下單接口中,有幾個參數(shù)需要特別注意:
a .隨機(jī)數(shù)字符串 nonce_str:不長于32位,可以是 時間戳+隨機(jī)序列 的拼接
b .簽名 sign:簽名時所帶參數(shù)一定是必帶的,沒必要的就不帶,要按照ASCII順序排,如果簽名錯誤,先檢查順序,然后檢查接口請求參數(shù)與簽名的參數(shù)是否一致
c.商戶訂單號 out_trade_no:商戶支付的訂單號由商戶自定義生成,微信支付要求商戶訂單號保持唯一性(建議根據(jù)當(dāng)前系統(tǒng)時間加隨機(jī)序列來生成訂單號)。重新發(fā)起一筆支付要使用原訂單號,避免重復(fù)支付;已支付過或已調(diào)用關(guān)單、撤銷(請見后文的API列表)的訂單號不能重新發(fā)起支付。
d .notify_url:接收微信支付異步通知回調(diào)地址,必須為直接可訪問的url,不能攜帶參數(shù)。微信請求的參數(shù)里面包含了訂單號等重要信息,如果是json格式,則需要其又通過 xml字段 包裹了一層。
nodejs偽代碼示例:
async function getOpenId(jsCode) {
? ? ? var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${jsCode}&grant_type=authorization_code';
? ? ? return new Promise((resolve, reject) => {
? ? ? ? ? ? request(url, {timeout 5000:}, function (error, respinse, body) {
? ? ? ? ? ? ? ? ? if (error) {
? ? ? ? ? ? ? ? ? ? ? ? ?reject(error);
? ? ? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ? ? ? resolve(body);
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? })
? ? ? }).catch(function (error) {
? ? ? ? ? ? ?conlose.log(error);
? ? ? });
}
'POST payment': async (ctx, next) => {
? ? ? var jsCode = ctx.request.body.js_code;
? ? ? var openid = await getOpenid(jsCode).openid;
? ? ? var url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
? ? ? var params = {
? ? ? ? ? ? appid: appid,
? ? ? ? ? ? body: body,
? ? ? ? ? ? mch_id: mch_id, ? ? ?//商戶id
? ? ? ? ? ? nonce_str: nonce_str, ? ? ? //隨機(jī)數(shù)字符串
? ? ? ? ? ? notify_url: notify_url,
? ? ? ? ? ? openid: openid,
? ? ? ? ? ? out_trade_no: out_trade_no, ? ? // 訂單號
? ? ? ? ? ? spbill_create_ip: spbill_create_ip,
? ? ? ? ? ? total_fee: total_fee,
? ? ? ? ? ? trade_type: 'JSAPI',
? ? ? }
? ? ? var sign = generateSign(params); ? ? ?// 生成簽名
? ? ? params.sign = sign;
? ? ? params = json2xml.buileObject({ xml, params }); ? ? ? ?// json轉(zhuǎn)xml
? ? ? var result = httpPost(url, params); ? ? ? ?// HTTP POST
? ? ? result = xml2json(result).xml; ? ? ? ?// 結(jié)果 xml 轉(zhuǎn) json,從中獲取訂單號等信息
...
}
二.客服接口相關(guān)
1.相對于支付接口,客服接口接比較坑,因為支付接口只要細(xì)心,確保了簽名正確,然后在支付推送接口中解析微信返回的參數(shù)即可??头涌冢f記住,如果只是單純的進(jìn)行小程序客服,不涉及到自定義客服消息,千萬不要去設(shè)置消息推送,因為一旦設(shè)置,用戶發(fā)給小程序的消息都將被轉(zhuǎn)發(fā)到已填寫的服務(wù)器地址,因此在小程序客服網(wǎng)頁就看不到客服消息了!如果不需要自定義客服消息的,那下面內(nèi)容可以不用看了。
未完待續(xù)......