??【2017-08-07 更新】
最新版本v0.3.1
做了比較大的修改,請查看最新的文檔:https://hexdocs.pm/wechat_pay/getting-started.html
最近用 Phoenix 在開發(fā)「時習(xí)」的時候,有個需求是需要實現(xiàn)在微信內(nèi)的支付系統(tǒng),發(fā)現(xiàn) Elixir 還沒有現(xiàn)成的包,goofansu 的 wechat-elixir 也還未實現(xiàn)支付功能风题,于是鼓搗出了 https://github.com/linjunpop/wechat_pay
目前支持公眾號支付,掃碼支付,App 支付傍睹。
一個公眾號支付的例子
先使用統(tǒng)一下單接口創(chuàng)建微信訂單:
{:ok, data} = WechatPay.API.PlaceOrder.request({
device_info: "WEB",
body: "Wechat-666",
attach: nil,
out_trade_no: "1415757673",
fee_type: "CNY",
total_fee: 709,
spbill_create_ip: "127.0.0.1",
notify_url: "http://example.com/wechat-pay-callback",
time_start: 20091225091010,
time_expire: 20091227091010,
trade_type: "JSAPI",
openid: "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o",
})
然后使用 WechatPay.HTML.generate_pay_request(data["prepay_id"])
來生成 pay request:
%{
"appId" => "wx2421b1c4370ec43b",
"timeStamp" => "1395712654",
"nonceStr" => "e61463f8efa94090b1f366cccfbbb444",
"package" => "prepay_id=u802345jgfjsdfgsdg888",
"signType" => "MD5",
"paySign" => "70EA570631E4BB79628FBCA90534C63FF7FADD89"
}
然后在客戶端使用生成的 pay request 來調(diào)用 JavaScript 的接口,就可以向用戶收錢啦犹菱,如下圖:
除了公眾號支付外的其他功能都是依據(jù)文檔實現(xiàn)拾稳,未在 production 的 app 里測試,如有問題腊脱,歡迎反饋访得。
最后再吐槽下微信:
- 文檔說所有的 API 都有 sandbox 環(huán)境,但是事實并非如此陕凹,發(fā)郵件咨詢之后也不了了之悍抑。
- sandbox 環(huán)境下的 sign 值不會根據(jù)提交數(shù)據(jù)的 appid 來計算,而永遠是一個無法匹配的值杜耙,官方也沒有給出一個測試可用的 appid 和 appkey搜骡,這樣 sandbox 環(huán)境也沒有實用意義
- 「交易保障」接口文檔里寫的提交數(shù)據(jù)需要的字段是
execute_time
,然而實際請求服務(wù)器要求的字段名卻是execute_time_
佑女,末尾多了一個莫名的下劃線浆兰,發(fā)郵件咨詢后說會修改磕仅,然而到現(xiàn)在還是一樣。╮(╯_╰)╭