本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考.

开发时间是2016/8/2,所以微信支付的版本也是对应此时的版本.

一.前期准备:

首先你们公司开通微信支付功能后,会收到一份邮件,里面有账户相关信息,一般有:微信支付商户号,商户平台登录帐号,商户平台登录密码,申请对应的公众号,公众号APPID。

1.下载demo:用上面信息登陆“微信商户平台”,>>>(右上角开发文档)>>>公众号支付>>>sdk下载>>>选php

2.下载证书:账户中心>>>api安全

    将下载的证书中的所有文件解压到demo的cert文件夹中(demo原先自带的要删掉),然后修改demo中lib/WxPay.Config.php中的以下配置
  const APPID = '邮件中有,`公众号APPID`';
  const MCHID = '邮件中有,`微信支付商户号`';
  const KEY = 'wxpay.config.php中注释有相关链接';
  const APPSECRET = '公众平台开发者中心设置,同样注释中有链接';

3.配置好后去微信公众平台,里面有微信支付功能如下图.在开发配置中设置支付目录和测试目录.这里主要是配置测试目录,支付目录可以先不管(我的域名是www.test.com),然后将自己的微信号加入测试白名单.

4.再去微信公众平台>>>开发>>>接口权限>>>网页服务的第一项`网页账号`,修改它的值为你自己的域名(仅仅是域名).如图:

二.demo代码修改(仅仅针对当前的版本):

     1.  修改文件WxPay.Api.php

将curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);

curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
   改为:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);

curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//严格校验2

   2.   如果访问jsapi.php时你要用get方式传递参数,那么你要去修改WxPay.JsapiPay.php中的

$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);

改为:

       $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);

或者在写链接时写两个??传参,例如:http://www.test.com/demo/example/jsapi.php??id=xxx&...

 3.删去wxpay.notify.php中的ReplyNotify函数中$this->GetReturn_code(‘参数’) == "SUCCESS"里面的’参数’.
 

三.开始开发,按大概流程讲述:

1.支付:首先点击支付后,会到jsapi.php文件中去,获取openid,这步我没管,也没出错;

然后是统一下单,他会设置一大堆参数,如图:

将里面的setNotify_url设置为你的notify.php文件所在的位置.

其中的setOut_trade_no和setTotal_fee这两个参数是你可以随便填写的(其他参数默认可以).在支付成功后微信服务器会将这两个参数的值返回给你.我是直接将商品订单号码放到setOut_trade_no中传递过去.在这一步,我遇到的问题是,get过来的字符串参数总是放不到setOut_trade_no中,最后我发现传过来的订单字符串被莫名奇妙的加上了单引号.于是我接收到字符串后先用trim函数处理,然后就能放入了.

此时点击支付,应该可以去支付了.(支付的结果在商户平台中查看)

  2.支付成功后的返回:支付完成后,微信服务器会自动请求你的notify.php文件.但是请求进入后直接通过最后一句$notify->Handle(false);跳到了WxPay.notify.php中,然后还调用了很多其他函数,整个过程我只处理了两个函数.

①WxPay.api.php中的notify函数,如图:

 这里面的$xml=$GLOBALS['HTTP_RAW_POST_DATA'];就是支付成功后用户返回给你的一个结果,他是一个xml格式的字符串.调试的时候可以将它输入到文件查看(结果是重复的,因为微信服务器会重复请求多次).$xml输出结果如图:
 其中的$out_trade_no就是在支付之前我自己设置的订单号码.接下来我们想办法得到这个订单号,然后我就直接在下面写支付成功后的逻辑了,如改变数据库中的数据等等.
 这个函数内其他的代码我没有管,只是最后一句return call_user_func($callback, $result);我直接改为return true;了.如果使用return call_user_func($callback, $result);就会有多次请求.
 ②.WxPay.api.php中的replyNotify函数,这个函数就是用来阻止微信服务器重复请求你的notify.php文件的,如图:
 查看完整个handle函数的调用过程后,会发现最后执行的就是这个函数.他的输出结果(echo $xml)就是notify.php文件中最后一句handle函数的结果.$xml的内容是什么呢?
 内容如图:
 可以看到$xml是一个xml格式字符串,他就是文档中说的返回给微信服务器的内容.所以我们不用做其他额外的返回操作了,微信自己就有返回结果的方法.
 一开始做什么都不懂,全是看别人的文章,在这一步看好多人说直接输出success,return success,或者写入流,等等,都没有成功,总是被请求多次.后来狠心看了代码,发现竟然有现成的.
四.支付后跳转
支付完成后,手机提示支付成功,并会显示支付信息,点击手机上的完成,页面可以跳转到你设置的页面.设置的地方是在jsapi.php文件中的jsApiCall函数中,我直接设置为跳转到百度.你设置为自己想要跳转到的页面路径即可.

至此,一个支付流程大致走完了,唯一的感觉就是觉的这个结果是自己七拼八凑蒙出来的,好晕.

题外:

微信支付的问题很多:

1.       demo代码有一堆错误

2.       文档很乱,讲的稀里糊涂,不够精确.

3.       官方给出的支付流程图很多字看不清楚,细看流程图发现竟然没有第三步,直接第二步过去,回来就成了第四步了

4.       微信支付后没有短信提示(这是最可怕的)

5.       手机微信绑定银行卡后,我仅仅是用来做开发测试的,每次支付0.01元,但是期间竟有一笔66元的支出,短信不提醒,查看支付细节要求我升级微信版本,升级微信时,提示不支持新版本……

6.       鉴于上面的问题,我很怀疑微信支付的业务逻辑会不会有问题(可能性很大,毕竟连官方demo都能出错).

php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员的更多相关文章

  1. php微信支付(仅pc端扫码支付模式二)详细步骤.----仅适合第一次做微信开发的程序员

    本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/10,所以微信支付 ...

  2. 微信公众号JSAPI支付

    微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心-&g ...

  3. 【weixi】微信支付---微信公众号JSAPI支付

    一.JSAPI支付 JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付.应用场景有: ◆ 用户在微信公众账号内进入商家公众号,打 ...

  4. java微信公众号JSAPI支付以及所遇到的坑

    上周做了个支付宝微信扫码支付,今天总结一下.微信相比支付宝要麻烦许多 由于涉及到代理商,没办法,让我写个详细的申请流程,懵逼啊. 笔记地址 http://note.youdao.com/notesha ...

  5. 网站如何接入微信公众号JSAPI支付PHP版

    1.首先,我们要有一个微信公众号(分类类型有订阅号,服务号,企业号)我们的微信公众号一定是个服务号只有它才有微信支付接口.. 并且这个微信公众号一定要进行微信认证才能申请微信支付接口. 2.申请JSA ...

  6. 微信公众号JSAPI支付-多公众号向同一商户号支付的问题解决

    一.背景 项目提供公众号商城集成,在公众号里进行商品的购买,并与多家公众号合作增加渠道流量. . 二.实现 有关微信公众号.商户号的开通与支付绑定不细说 从背景里可知,我们需要实现多个公众号购买向同一 ...

  7. 微信小程序支付(JSAPI支付)

    开发环境:.NET MVC+ ORM框架(EF) 一.参考文档: 1.微信JSAPI支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api. ...

  8. PHP应用如何对接微信公众号JSAPI支付

    微信支付的产品有很多,1. JSAPI支付  2. APP支付  3. Native支付  4.付款码支付  5. H5支付. 其中基于微信公众号开发的应用选择“JSAPI支付“产品,其他APP支付需 ...

  9. 在Thinkphp中微信公众号JsApi支付

    由于网站使用的微信Native扫码支付,现在公众号需要接入功能,怎么办呢,看这官方文档,参考着demo进行写吧.直接进入正题 进入公众号(服务号)设置--->功能设置--->网页授权域名配 ...

随机推荐

  1. apache常见错误汇总

    <>问题: Access forbidden! You don't have permission to access the requested directory. There is ...

  2. javascript获取鼠标位置

    首先不同浏览器中event位置属性的分析: 1. IE的event.x,event.y是以事件触发元素的父元素外界为参考点(不包括滚动距离) 2. Firefox的event.pageX,event. ...

  3. 称球问题(zt)

    下面说的这个问题可能大家都看到过,它是这么描述的: 现在有n(n>=2)个球,n个球外观一模一样,但是重量有区别,其中有且仅有一个球的重量比其它n-1个球要重,现在有一个天平,天平是完好无损的, ...

  4. HBase-再看HBase

    为什么HBase主要应用于在线应用系统?(还没搞懂) www.github.com/HBaseinaction google 三大论文  Google File System MapReduce Bi ...

  5. Message Decoding

    Some message encoding schemes require that an encoded message be sent in two parts. The first part, ...

  6. envi5.1下载地址

    ENVI 5.1 installer 32 bit :链接: http://pan.baidu.com/s/1c0EGZIw 密码: gcogENVI 5.1 Installer 64 bit :链接 ...

  7. C语言有关数组的几点

    动态大小数组 先来看一段代码: ; int a[n]; int i; ;i<n;i++) { a[i]=i; printf("%d\n",a[i]); } 我在声明数组a时, ...

  8. Zabbix Api的使用

    API使用 zabbix官网文档:https://www.zabbix.com/documentation/2.2/manual/api, Zabbix API是基于JSON-RPC 2.0规格,具体 ...

  9. hdu 4005 边连通度与缩点

    思路:先将图进行缩点,建成一颗树,那么如果这是一条单路径树(即最大点度不超过2),就不在能删的一条边,使得不连通.因为将其头尾相连,形成一个圈,那么删任意一条边,图都是连通的. 上面的是无解的情况,如 ...

  10. 本机连接虚拟机Oracle时报错的解决办法

    虚拟机安装了Oracle服务器(桌面类)和客户端,里面使用plsql连接自己没有问题. 在本机连接虚拟机没有成功.虚拟机的地址是192.168.126.132,已经确认本机能ping通虚拟机. 先是报 ...