分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件


Posted in PHP onAugust 23, 2015

最近比较工作比较轻松,帮一个朋友的基于ecshop开发的商城加入微信扫描支付功能,本以为是很简单的事儿——下载官方sdk或开发帮助文档,按着里面的做就ok了,谁知折腾了两三天的时间才算搞定,中间也带着疑问在网上找了不少技术文章,却发现都只是比较粗略的写他们是怎么开发接入的,并没有解决我遇到的问题...,唉,有时候真心的感觉‘只能靠自己'。

本文就是想把自己遇到的问题及解决办法写出来,让做这方面开发的朋友有所帮助!

开发之前,先查看官方【扫码支付】开发文档,扫码支付分为以下两种模式:

△模式一:

遇到的问题:第一次扫描二维码还能正常扫描,未付款再次扫描会提示:ok 或 请求商户信息超时HttpCode非200——此问题尝试通过各种途径寻找解决办法都无果,在这里希望有知道朋友能给与解答,谢谢!

△模式二:

注意:不可以直接用商城的订单号作为交易订单号(out_trade_no),否则再次生成微信扫码支付二维码时,接口会提示:商户订单号重复,无法重新生成。

那么酱紫问题来了,应该怎样设置交易订单号,还能保证后面通过接口查询微信商户平台里的相应订单信息或实现对账?可行的办法是:扫码之前的统一下单接口,out_trade_no不要传入商城订单系统的订单号,而是重新生成一个新的唯一流水;再增加一个订单号和微信支付交易订单号(out_trade_no)对应表,如下:

分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件

     上表中有个serial_is_paid字段:用于标记此交易是否已完成,即:在支付成功通知回调处理中,根据回传的out_trade_no更新支付状态;至于怎么查询订单支付状态,想必你应该也知道了...

    分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件

好了,很久没写技术博客有些找不到感觉,写的可能比较粗略,有不清楚的朋友可以留意&交流!

到处都是坑的微信支付V3之 微信支付回调页面

据上次 到处都是坑的微信支付V3 后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程。

1. html中根据前台支付后反馈信息成功与否跳转到相关页面

if (res.err_msg == "get_brand_wcpay_request:ok") {
   // message: "微信支付成功!",
   window.location.replace("@Url.Content("~/WxPay/Success?ordercode=@(Model.order_no)"));
}else if (res.err_msg == "get_brand_wcpay_request:cancel") { 
  // message: "已取消微信支付!"
 }

2. 支付开发教程(微信商户平台版) 中下载 微信支付接口文档及demo(公众账号).zip

返回的参数参考接口文档中  4.2.通用通知接口  一节。

通知 URL是 4.1 节中提交的参数 notify_url ,支付完成后,微信 会把相关和用户信息发送到该URL,商户需要接收处理信息。

//支付回调页面
    public ActionResult notice_url()
    {
      string resultFromWx = getPostStr();
      //设置支付参数
      RequestHandler paySignReqHandler = new RequestHandler(null);
      WriteLog(" 微支付notice resultFromWx=" + resultFromWx);
      var res = XDocument.Parse(resultFromWx);
      //通信成功
      if (res.Element("xml").Element("return_code").Value == "SUCCESS")
      {
        if (res.Element("xml").Element("result_code").Value == "SUCCESS")
        {
          //交易成功
          paySignReqHandler.SetParameter("return_code", "SUCCESS");
          paySignReqHandler.SetParameter("return_msg", "OK");
          string ordecode = res.Element("xml").Element("out_trade_no").Value;
          BLL.orders Bll = new BLL.orders();
          try
          {
            if (Bll.Update(ordecode ))
            {
             WriteLog(" 微支付交易成功=" + ordecode);
            }
            else
            {
             WriteLog(" 微支付交易失败=" + ordecode);
            }
          }
          catch (Exception ex)
          {
            WriteLog(ex," 微支付交易异常=" + ordecode);
          }
        }
        else
        {
          paySignReqHandler.SetParameter("return_code", "FAIL");
          paySignReqHandler.SetParameter("return_msg", "交易失败");
        }
      }
      else
      {
        paySignReqHandler.SetParameter("return_code", "FAIL");
        paySignReqHandler.SetParameter("return_msg", "签名失败");
      }
      string data = paySignReqHandler.ParseXML();
      var result = TenPayV3.Unifiedorder(data);
      WriteLog(" 微支付notice result=" + result);
      return View();
    }

注意:

因此接收到成功支付后需要返回代码中红色的部分来提醒微信服务器已处理,否则会不断收到微信服务器的反馈。

getPostStr()方法:

//获得Post过来的数据
    public string getPostStr()
    {
      Int32 intLen = Convert.ToInt32(Request.InputStream.Length);
      byte[] b = new byte[intLen];
      Request.InputStream.Read(b, 0, intLen);
      return System.Text.Encoding.UTF8.GetString(b);
    }

 现在前后台都打通了,主要还是要耐心调试,祝君好运~

PHP 相关文章推荐
简单的用PHP编写的导航条程序
Oct 09 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
php去除HTML标签实例
Nov 06 PHP
php格式化日期实例分析
Nov 12 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
Dec 14 PHP
php编程每天必学之表单验证
Mar 01 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
php mysql实现mysql_select_db选择数据库
Dec 30 PHP
php生成0~1随机小数的方法(必看)
Apr 05 PHP
PHP实现的简单适配器模式示例
Jun 22 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
Aug 23 #PHP
详细解读PHP的Yii框架中登陆功能的实现
Aug 21 #PHP
使用PHP进行微信公众平台开发的示例
Aug 21 #PHP
PHP的Yii框架的基本使用示例
Aug 21 #PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 #PHP
win7系统配置php+Apache+mysql环境的方法
Aug 21 #PHP
php生成图片验证码-附五种验证码
Aug 19 #PHP
You might like
织梦模板标记简介
2007/03/11 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
2018/09/29 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
Python3 能振兴 Python的原因分析
2014/11/28 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
Python Socket使用实例
2017/12/18 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
ipad上运行python的方法步骤
2019/10/12 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
农村婚礼证婚词
2014/01/10 职场文书
护理专业自我鉴定
2014/01/30 职场文书
法院授权委托书格式
2014/09/28 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
社会心理学学习心得体会
2016/01/22 职场文书