分享微信扫码支付开发遇到问题及解决方案-附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 相关文章推荐
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
一个比较简单的PHP 分页分组类
Dec 10 PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 PHP
php 数组的一个悲剧?
May 11 PHP
基于php iconv函数的使用详解
Jun 09 PHP
PHP之短标签开启设置
Jun 17 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
ThinkPHP中使用ajax接收json数据的方法
Dec 18 PHP
详谈PHP编码转换问题
Jul 28 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 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
PHP操作数组相关函数
2011/02/03 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
Function eregi is deprecated (解决方法)
2013/06/21 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
python发送arp欺骗攻击代码分析
2014/01/16 Python
Python 正则表达式的高级用法
2016/12/04 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
python多线程分块读取文件
2019/08/29 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
Pytorch之保存读取模型实例
2019/12/30 Python
python如何编写win程序
2020/06/08 Python
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
高中生自我鉴定范文
2013/10/30 职场文书
毕业生的自我评价
2013/12/30 职场文书
生产文员岗位职责
2014/04/05 职场文书
室内设计专业自荐信
2014/05/31 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
机关保密工作承诺书
2015/05/04 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python
联想win10摄像头打不开怎么办?win10笔记本摄像头打不开解决办法
2022/04/08 数码科技