文字说明;

前提:注册、申请服务号,开通微信支付。

涉及到的参数:AppId、AppSecret、原始ID(自动回复)、mch_id(商户号)、Key(商户密钥:自己设定。)

统一规范:

  • 要求
  1. 认证方式:HTTPS 认证,退款和冲正接口调用需要商户证书(证书在审核邮件附件中)。

  2. 请求采用POST 方式。
  3. 提交和返回结果采用XML格式。
  4. 字符集默认使用UTF-8,请勿使用其它字符集。
  5. 商户与微信之间的交互(特别是Native 回调和支付通知回调),都需要验证签名
  6. 处理返回时先判断协议返回错误码,再判断业务返回错误码,最后判断交易状态。
  • 统一加密方式:MD5。
  • 统一签名生成方式:

    •   传入参数按字段名ascii码从小到大排序,使用url键值对的格式(key1=value1&key2=value2...)拼接成字符串注:值为空的参数不参与签名)。在字符串最后再拼接上&key=Key(商户密钥),然后进行MD5加密处理,最后得到的字符串转换为大写

微信支付:

  • jsapi支付和native支付都需要调用统一支付接口(URL 地址:https://api.mch.weixin.qq.com/pay/unifiedorder)
  • jsapi支付
    • jsapi 调用统一支付接口需要参数openid(通过Oath2.0授权获取)。
    • 统一支付接口返回参数需要先验证签名,然后获取prepay_id。
    • document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
      
        //公众号支付
        jQuery('#wxPay').click(function(e){     WeixinJSBridge.invoke('getBrandWCPayRequest',{
          "appId" : appId, //公众号名称,由商户传入
          "timeStamp" : timeStamp,   //时间戳
          "nonceStr" : nonceStr,    //随机串
          "package" : package,     //格式:prepay_id=xxxx
          "signType" : signType,    //签名方式:MD5
          "paySign" : paySign      //签名:生成签名参数appId、timeStamp、nonceStr、package、signType、key 注意参数名大小写。
          },function(res){
            if(res.err_msg == "get_brand_wcpay_request:ok" ) {
              window.location.href=url;   //支付成功后跳转到的页面用于展示
            }
            // else {
              // alert(res.err_code+res.err_desc+res.err_msg);
            // }
          });   }); }, false) 
    • 注:jsapi页面点击了两次“微信支付”,生成了两笔订单,需要在页面微信支付按钮上增加防二次点击的机制。
  • native支付

    • 参数product_id必须的
    • 调用统一支付接口获取code_url,并生成二维码图片。

微信支付回调notify_url:

    获取xml格式参数,验证签名,处理逻辑(通知后台会多次回调,先检查是否处理过,在执行)。

代码区:

  • 生成Sign公共方法:
  • public string CreateSign(Dictionary<string, string> collection)
    {
      //排序
      List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>(collection);
      list.Sort(delegate(KeyValuePair<string, string> pair1, KeyValuePair<string, string> pair2)
      {
        return pair1.Key.CompareTo(pair2.Key);
      });   StringBuilder sb = new StringBuilder();
      foreach (KeyValuePair<string, string> pair in list)
      {
        sb.Append(pair.Key);
        sb.Append("=");
        sb.Append(pair.Value);
        sb.Append("&");
      }
      string str = sb.Append("key=value").ToString();
      string signValue = MD5(str).ToUpper(); //md5加密并转换成大写
      return signValue ;
    }
  • xml 和 Dictionary 转换方法:
  • public string DictionaryToXml(Dictionary<string, string> collection)
    {
      StringBuilder sb = new StringBuilder();
      sb.Append("<xml>");
      foreach (KeyValuePair<string, string> pair in collection)
      {
        sb.Append("<" + pair.Key + ">");
        sb.Append("<![CDATA[" + pair.Value + "]]>");
        sb.Append("</" + pair.Key + ">");
      }
      sb.Append("</xml>");
      return sb.ToString();
    } public Dictionary<string, string> XmlToDictionary(XmlDocument doc)
    {
      Dictionary<string, string> collection = new Dictionary<string, string>();
      foreach (XmlElement element in doc.DocumentElement.ChildNodes)
      {
        string key = element.Name;
        string value = element.InnerText;
        if (value != "")
        {
          collection.Add(key, value);
        }
      }
      return collection;
    }
  • 获取Json某一key值:
  • public string GetJosnValue(string jsonStr, string key)
    {
      string result = string.Empty;
      if (!string.IsNullOrEmpty(jsonStr))
      {
        key = "\"" + key.Trim('"') + "\"";
        int index = jsonStr.IndexOf(key) + key.Length + ;
        if (index > key.Length + )
        {
          //先截逗号,若是最后一个,截“}”号,取最小值       int end = jsonStr.IndexOf(',', index);
          if (end == -)
          {
            end = jsonStr.IndexOf('}', index);
          }
          //index = json.IndexOf('"', index + key.Length + 1) + 1;
          result = jsonStr.Substring(index, end - index);
          //过滤引号或空格
          result = result.Trim(new char[] { '"', ' ', '\'' });
        }
      }
      return result;
    }

  

微信支付 v 3.3.6的更多相关文章

  1. Android—基于微信开放平台v3SDK,开发微信支付填坑。

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...

  2. ***CodeIgniter集成微信支付(转)

    微信支付Native扫码支付模式二之CodeIgniter集成篇  http://www.cnblogs.com/24la/p/wxpay-native-qrcode-codeigniter.html ...

  3. ****基于H5的微信支付开发详解[转]

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  4. 到处都是坑的微信支付V3

    业务需要一个在微信上能付款的功能,于是乎想到了最普遍的支付宝,坑爹的是T与A是水火不容啊,默默的还是接微信支付吧,没想到从此掉进了连环坑…… 网上写微信支付接口的还是很多,PHP官方有(鄙视源码作者, ...

  5. NET微信公众号开发-5.0微信支付(待测试)

    开发前准备. 1.0微信支付官方开发者文档 2.0官方demo下载 我们用c#所以选择.net版本 不过这个官方的demo根本跑步起来 3.0官方demo运行起来解决方案 4.0微信支付官方.net版 ...

  6. 微信支付Native扫码支付模式二之CodeIgniter集成篇

    CI:3.0.5 微信支付API类库来自:https://github.com/zhangv/wechat-pay 请先看一眼官方场景及支付时序图:https://pay.weixin.qq.com/ ...

  7. 微信支付JSAPI模式及退款CodeIgniter集成篇

    微信支付接口文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1 首先你得知道这个jsapi是不能离开微信进行调用支付的,明白 ...

  8. android微信支付总结+自己搭建服务器

    1.前期注册操作 1-1:微信开发平台:https://open.weixin.qq.com/ 1-2:创建移动应用 签名获取: 1.将自己的apk签名打包,运行到手机上. 2.将微信支付的签名工具, ...

  9. (实用篇)php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)

    微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中.内容有:微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI <?php class ...

随机推荐

  1. python升级导致的坑

    问题来源 问题往往都是这样来的突然,让我措手不及. 小孩没娘说来话长啊,操作系统是centos6.5因此默认自带的python是2.6.6的,突然有一天我要写一个关于kafka topic消费情况的监 ...

  2. python-多线程(原理篇)

    多线程的基本概念 语言学习总是绕不过一些东西,例如多进程和多线程,最近越来越发现,上来看几个实例练习一下过几天就不知其所以然了.所以还是先看看原理,在看实例练习吧! 线程的概念 概念:线程是进程中执行 ...

  3. Ognl中根元素与非根元素的关系

    Ognl中根元素与非根元素的关系 根元素:可以理解为全局变量 非根元素:局部变量 从两者获取其属性的方式看: Object obj = Ognl.parseExpression(“[1]”); [1] ...

  4. The encryption certificate of the relying party trust identified by thumbprint is not valid

    CRM2013部署完ADFS后通过url在浏览器中訪问測试是否成功,成功进入登陆界面但在登陆界面输入username和password后始终报身份验证失败,系统中的报错信息例如以下:Microsoft ...

  5. 【Android】自带Theme

    [Android]自带Theme android之uses-permission   在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Android uses-permission的 ...

  6. 非数值(Not a Number)NaN的解释

    它是一个特殊的数值.它用于表示一个本来要返回数值的操作数未返回数值的情况. 在ECMAScript中,任何数值除以0会返回NaN,而不会导致错误,不会停止代码的执行,因此不会影响其他代码的执行. Na ...

  7. SVG image xlink:href 设置失败

    公司比较频繁的业务需求,需要在地图上面,标注地区的信息,考虑到兼容性问题,在实际开发中是通过raphael.js绘制地图信息,进行相关交互 产品部门同事辛苦的画SVG地图,可配置地图块与实际地区cod ...

  8. 编写一个程序实现strcpy函数的功能

    #include <stdio.h> #include <string.h> #define N 5 char *mycpy(char *s1, char *s2) { //数 ...

  9. canvas1

    canvas学习(一) Canvas 学习之路 (一) canvas 是H5 里面神一样的东西,使得只是通过html和js就能做出非常棒的游戏和画面. 因为对前端无限的爱好,更加对canvas充满好奇 ...

  10. Android Studio设置自动编译工程