| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- local http = require("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
|