设为首页收藏本站订阅更新

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

搜索
查看: 2390|回复: 3

[推荐] 微信支付接口

[复制链接]
发表于 2015-10-30 12:53:46 | 显示全部楼层 |阅读模式
本帖最后由 Rimifon 于 2015-10-30 13:22 编辑

完整的微信支付流程是(假设页面已通过JS接口调用认证):
服务端创建一个支付订单 - 客户端根据订单参数通过JS调用支付界面完成支付

创建支付订单需要传入的参数为:
  1. {
  2.         body : "测试支付",// 商品名称
  3.         total_fee : 1,        // 订单总金额,单位为分
  4.         out_trade_no : "TradeNO",
  5.         openid : "wx.OpenID",
  6.         notify_url : "异步回调通知地址",
  7.         appid : app.appId,
  8.         mch_id : app.mchId,
  9.         device_info : "WEB",
  10.         fee_type : "CNY",
  11.         spbill_create_ip : "127.0.0.1",
  12.         trade_type : "JSAPI",
  13.         nonce_str : "随机字符串",
  14.         sign : "签名"
  15. }
复制代码

JS端调用支付界面需要传入的参数为:
  1. {
  2.         timestamp : '',
  3.         nonceStr : '',
  4.         'package' : '',        // 我记得以前JS把 package 规定为保留关键字了,但是不用单用号作为键名好像也不会出现语法错误?
  5.         signType : '',
  6.         paySign : ''
  7. }
复制代码

代码如下:

  1. /* ========= 签名代码 ============= */
  2. function makeSign(arg, mchKey) { // 需要商户key
  3.         if("#RAND#" in arg) {
  4.                 arg[arg["#RAND#"]] = randStr(16);
  5.                 delete arg["#RAND#"];
  6.         }
  7.         var par = new Array;
  8.         for(var x in arg) par.push(x + "=" + arg[x]);
  9.         par.sort();
  10.         return crypto(par.join("&") + "&key=" + mchKey, "MD5");
  11.         // 随机字符
  12.         function randStr(len) {
  13.                 var dic = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  14.                 var arr = new Array;
  15.                 while(arr.length < len) arr.push(dic.charAt(~~(Math.random() * dic.length)));
  16.                 return arr.join("");
  17.         }
  18.         // 加密算法,支持MD5和SHA1
  19.         function crypto(str, type) {
  20.                 if(!type) type = "MD5";
  21.                 var xml = new ActiveXObject("Microsoft.XmlDom");
  22.                 var utf = new ActiveXObject("System.Text.UTF8Encoding");
  23.                 var cry = new ActiveXObject("System.Security.Cryptography." + type + "CryptoServiceProvider");
  24.         
  25.                 xml.loadXML("<root />");
  26.                 var root = xml.documentElement;
  27.                 root.dataType = "bin.hex";
  28.                
  29.                 var bin = utf.GetBytes_4(str);
  30.                 root.nodeTypedValue = cry.ComputeHash_2(bin);
  31.                 return root.text.toUpperCase();
  32.         }
  33. }


  34. /* 证书请求[支付接口不要求证书,但是如果服务器上装了证书便必须使用证书,否则会出现缺少对象的错误] */
  35. function SSL(url, arg) {
  36.         // 将字典转换为xml
  37.         var data = ["<xml>"];
  38.         for(var x in arg) data.push("<" + x + ">" + arg[x] + "</" + x + ">");
  39.         data.push("</xml>");
  40.         var xhr = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
  41.         xhr.open("POST", url, true);
  42.         xhr.setClientCertificate("LOCAL_MACHINE\\MY\\证书受体单位名称");// 没装证书可尝试注释这行
  43.         xhr.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
  44.         xhr.send(data.join("\r\n"));
  45.         xhr.waitForResponse();
  46.         var xml = new ActiveXObject("Microsoft.XmlDom");
  47.         var strXml = new ActiveXObject("System.Text.UTF8Encoding").GetString(xhr.responseBody);
  48.         xml.loadXML(strXml);
  49.         return function(att){ return (xml.selectSingleNode("/xml/" + att) || { text : strXml }).text; }
  50. }


  51. /* ============ 需要准备公众号ID、Secret、商户ID和Key ========== */
  52. var app = { appId : "", appKey : "", mchId : "", mchKey : "" };
  53. var trade = {
  54.         body : "测试支付",// 商品名称
  55.         total_fee : 1,        // 订单总金额,单位为分
  56.         out_trade_no : "TradeNO", //  用户订单号
  57.         openid : "wx.OpenID",
  58.         notify_url : "异步回调通知地址",
  59.         appid : app.appId,
  60.         mch_id : app.mchId,
  61.         device_info : "WEB",
  62.         fee_type : "CNY",
  63.         spbill_create_ip : "127.0.0.1",
  64.         trade_type : "JSAPI",
  65.         "#RAND#" : "nonce_str"

  66. };
  67. trade.sign = makeSign(trade, app.mchKey);
  68. // 根据参数创建订单号
  69. var rs = SSL("https://api.mch.weixin.qq.com/pay/unifiedorder", trade);
  70. // 需要判断订单是否创建成功
  71. // if(rs("return_code") != "SUCCESS") return rs("return_msg");
  72. // 为客户端JS参数签名
  73. var dic = {
  74.         appId : app.appId,
  75.         "#RAND#" : "nonceStr",
  76.         package : "prepay_id=" + rs("prepay_id"),
  77.         signType : "MD5",
  78.         timeStamp : new Date - 0

  79. };
  80. dic.paySign = makeSign(dic, app.mchKey);
  81. // 将js参数已json方式返回给客户端。
  82. //return  "{ timestamp : '" + dic.timeStamp + "', nonceStr : '" + dic.nonceStr + "', 'package' : '" + dic.package + "', signType : '" + dic.signType + "', paySign : '" + dic.paySign + "' }";
复制代码

客户端使用 wx.chooseWXPay方法调出支付界面。
发表于 2015-11-9 14:14:57 | 显示全部楼层
有没有演示地址,,
 楼主| 发表于 2015-11-14 16:20:52 | 显示全部楼层
发表于 2015-11-23 15:10:03 | 显示全部楼层
能否做个DEMO演示,
您需要登录后才可以回帖 登录 | 加入无忧

本版积分规则

小黑屋|手机版|Archiver|无忧脚本 ( 苏ICP备05080427号 )|值班电话:027-62300445   鄂公网安备 42011102000433号

GMT+8, 2017-11-18 07:05 , Processed in 0.095141 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表