??【2017-08-07 更新】
最新版本v0.3.1做了比較大的修改,請(qǐng)查看最新的文檔:https://hexdocs.pm/wechat_pay/getting-started.html
最近用 Phoenix 在開(kāi)發(fā)「時(shí)習(xí)」的時(shí)候,有個(gè)需求是需要實(shí)現(xiàn)在微信內(nèi)的支付系統(tǒng),發(fā)現(xiàn) Elixir 還沒(méi)有現(xiàn)成的包,goofansu 的 wechat-elixir 也還未實(shí)現(xiàn)支付功能,于是鼓搗出了 https://github.com/linjunpop/wechat_pay
目前支持公眾號(hào)支付,掃碼支付,App 支付。
一個(gè)公眾號(hào)支付的例子
先使用統(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"]) 來(lái)生成 pay request:
%{
"appId" => "wx2421b1c4370ec43b",
"timeStamp" => "1395712654",
"nonceStr" => "e61463f8efa94090b1f366cccfbbb444",
"package" => "prepay_id=u802345jgfjsdfgsdg888",
"signType" => "MD5",
"paySign" => "70EA570631E4BB79628FBCA90534C63FF7FADD89"
}
然后在客戶端使用生成的 pay request 來(lái)調(diào)用 JavaScript 的接口,就可以向用戶收錢啦,如下圖:
IMG_1708.PNG
除了公眾號(hào)支付外的其他功能都是依據(jù)文檔實(shí)現(xiàn),未在 production 的 app 里測(cè)試,如有問(wèn)題,歡迎反饋。
最后再吐槽下微信:
- 文檔說(shuō)所有的 API 都有 sandbox 環(huán)境,但是事實(shí)并非如此,發(fā)郵件咨詢之后也不了了之。
- sandbox 環(huán)境下的 sign 值不會(huì)根據(jù)提交數(shù)據(jù)的 appid 來(lái)計(jì)算,而永遠(yuǎn)是一個(gè)無(wú)法匹配的值,官方也沒(méi)有給出一個(gè)測(cè)試可用的 appid 和 appkey,這樣 sandbox 環(huán)境也沒(méi)有實(shí)用意義
- 「交易保障」接口文檔里寫的提交數(shù)據(jù)需要的字段是
execute_time,然而實(shí)際請(qǐng)求服務(wù)器要求的字段名卻是execute_time_,末尾多了一個(gè)莫名的下劃線,發(fā)郵件咨詢后說(shuō)會(huì)修改,然而到現(xiàn)在還是一樣。╮(╯_╰)╭