102 lines
2.8 KiB
Lua
102 lines
2.8 KiB
Lua
local http = require("fwutils.httpclient")
|
|
|
|
local M = {}
|
|
-- 微信支付统一下单
|
|
local url_pay = "https://api.mch.weixin.qq.com/pay/unifiedorder"
|
|
|
|
|
|
-- 纯文本方式取中间内容(不使用正则)
|
|
function extract_between(text, start_str, end_str)
|
|
local start_pos = string.find(text, start_str, 1, true)
|
|
if not start_pos then return nil end
|
|
|
|
local from = start_pos + #start_str
|
|
local end_pos = string.find(text, end_str, from, true)
|
|
if not end_pos then return nil end
|
|
|
|
return string.sub(text, from, end_pos - 1)
|
|
end
|
|
|
|
|
|
-- 验签
|
|
M.sign = function(data,key)
|
|
local sign_str = ""
|
|
local keys = {}
|
|
for k,_ in pairs(data) do
|
|
table.insert(keys, k)
|
|
end
|
|
table.sort(keys)
|
|
for i,k in ipairs(keys) do
|
|
if i > 1 then
|
|
sign_str = sign_str .. "&"
|
|
end
|
|
sign_str = sign_str .. k .. "=" .. data[k]
|
|
end
|
|
sign_str = sign_str .. "&key=" .. key
|
|
return string.upper(codec.md5(sign_str))
|
|
end
|
|
|
|
-- 微信支付统一下单
|
|
M.unified_order = function(appid,mch_id,openid,key,body,out_trade_no,total_fee,notify_url)
|
|
function xml_make(data)
|
|
local xml_data = "<xml>"
|
|
for k,v in pairs(data) do
|
|
xml_data = xml_data .. "<" .. k .. ">" .. v .. "</" .. k .. ">"
|
|
end
|
|
xml_data = xml_data .. "</xml>"
|
|
return xml_data
|
|
end
|
|
local data = {
|
|
appid = appid,
|
|
body = body,
|
|
mch_id = mch_id,
|
|
nonce_str = fw.make_software_guid(),
|
|
notify_url = notify_url,
|
|
openid = openid,
|
|
out_trade_no = out_trade_no,
|
|
spbill_create_ip = request.remote_ipaddress(),
|
|
total_fee = total_fee,
|
|
trade_type = "JSAPI",
|
|
}
|
|
data.sign = M.sign(data,key)
|
|
|
|
-- 生成XML
|
|
local xml_data = xml_make(data)
|
|
-- print("================xml_request=================")
|
|
-- print(appid,"|",mch_id,"|",openid,"|",key,"|",body,"|",out_trade_no,"|",total_fee,"|",notify_url)
|
|
-- print(xml_data)
|
|
|
|
local result,res = http.post(url_pay,{
|
|
["Content-Type"] = "text/xml",
|
|
}, xml_data)
|
|
if not result then
|
|
return false,"request error"..res
|
|
end
|
|
-- print("============res=============")
|
|
-- print(res)
|
|
|
|
-- 取中间文本
|
|
local result_code = extract_between(res,"<result_code><![CDATA[","]]></result_code>")
|
|
if result_code ~= "SUCCESS" then
|
|
return false,extract_between(res,"<err_code_des><![CDATA[","]]></err_code_des>")
|
|
end
|
|
|
|
local prepay_id = extract_between(res,"<prepay_id><![CDATA[","]]></prepay_id>")
|
|
|
|
local result_data = {
|
|
appId = appid,
|
|
nonceStr = fw.make_software_guid(),
|
|
package = "prepay_id=" .. prepay_id,
|
|
signType = "MD5",
|
|
timeStamp = string.format("%d",os.time())
|
|
}
|
|
result_data["paySign"] = M.sign(result_data,key)
|
|
return true,result_data
|
|
end
|
|
|
|
|
|
|
|
return M
|
|
|
|
|