wxpay.lua 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. local http = require("httpclient")
  2. local M = {}
  3. -- 微信支付统一下单
  4. local url_pay = "https://api.mch.weixin.qq.com/pay/unifiedorder"
  5. -- 纯文本方式取中间内容(不使用正则)
  6. function extract_between(text, start_str, end_str)
  7. local start_pos = string.find(text, start_str, 1, true)
  8. if not start_pos then return nil end
  9. local from = start_pos + #start_str
  10. local end_pos = string.find(text, end_str, from, true)
  11. if not end_pos then return nil end
  12. return string.sub(text, from, end_pos - 1)
  13. end
  14. -- 验签
  15. M.sign = function(data,key)
  16. local sign_str = ""
  17. local keys = {}
  18. for k,_ in pairs(data) do
  19. table.insert(keys, k)
  20. end
  21. table.sort(keys)
  22. for i,k in ipairs(keys) do
  23. if i > 1 then
  24. sign_str = sign_str .. "&"
  25. end
  26. sign_str = sign_str .. k .. "=" .. data[k]
  27. end
  28. sign_str = sign_str .. "&key=" .. key
  29. return string.upper(codec.md5(sign_str))
  30. end
  31. -- 微信支付统一下单
  32. M.unified_order = function(appid,mch_id,openid,key,body,out_trade_no,total_fee,notify_url)
  33. function xml_make(data)
  34. local xml_data = "<xml>"
  35. for k,v in pairs(data) do
  36. xml_data = xml_data .. "<" .. k .. ">" .. v .. "</" .. k .. ">"
  37. end
  38. xml_data = xml_data .. "</xml>"
  39. return xml_data
  40. end
  41. local data = {
  42. appid = appid,
  43. body = body,
  44. mch_id = mch_id,
  45. nonce_str = fw.make_software_guid(),
  46. notify_url = notify_url,
  47. openid = openid,
  48. out_trade_no = out_trade_no,
  49. spbill_create_ip = request.remote_ipaddress(),
  50. total_fee = total_fee,
  51. trade_type = "JSAPI",
  52. }
  53. data.sign = M.sign(data,key)
  54. -- 生成XML
  55. local xml_data = xml_make(data)
  56. -- print("================xml_request=================")
  57. -- print(appid,"|",mch_id,"|",openid,"|",key,"|",body,"|",out_trade_no,"|",total_fee,"|",notify_url)
  58. -- print(xml_data)
  59. local result,res = http.post(url_pay,{
  60. ["Content-Type"] = "text/xml",
  61. }, xml_data)
  62. if not result then
  63. return false,"request error"..res
  64. end
  65. -- print("============res=============")
  66. -- print(res)
  67. -- 取中间文本
  68. local result_code = extract_between(res,"<result_code><![CDATA[","]]></result_code>")
  69. if result_code ~= "SUCCESS" then
  70. return false,extract_between(res,"<err_code_des><![CDATA[","]]></err_code_des>")
  71. end
  72. local prepay_id = extract_between(res,"<prepay_id><![CDATA[","]]></prepay_id>")
  73. local result_data = {
  74. appId = appid,
  75. nonceStr = fw.make_software_guid(),
  76. package = "prepay_id=" .. prepay_id,
  77. signType = "MD5",
  78. timeStamp = string.format("%d",os.time())
  79. }
  80. result_data["paySign"] = M.sign(result_data,key)
  81. return true,result_data
  82. end
  83. return M