php微信支付接口开发程序


Posted in PHP onAugust 02, 2016

php微信支付接口开发程序讲解

必要条件:
appid //公众号后台开发者中心获得(和邮件内的一样)  

mchid//邮件内获得 

key//商户后台自己设置 

appsecret //公众号开发者中心获得
两个证书文件,邮件内获得 apiclient_cert.pem   apiclient_key.pem
注意事项:
公众号后台微信支付-》开发配置-》新增测试目录和测试个人微信号。
开发者中心-》网页授权获取用户基本信息-》修改成你的测试域名。否则会出现redirect_uri 参数错误
——————————后续待完善——————-
微信支付就绪页面后台自行了三次操作:

1.获取openid

//使用jsapi接口
 
 代码如下复制代码
  $jsApi = new JsApi_pub();
 
  //=========步骤1:网页授权获取用户openid============
  //通过code获得openid
  if (!isset($_GET['code']))
  {
    //触发微信返回code码
    $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
    //echo $url;
    Header("Location: $url");
  }else
  {
    //获取code码,以获取openid
    $code = $_GET['code'];
    $jsApi->setCode($code);
    $openid = $jsApi->getOpenid();
  }

刚开始的时候第一步也遇到问题,没法获得openid这个和部分服务器有关,demo内用的是curl获取的方式。
奇怪我的服务器curl一直无法获取到。后来改成file_get_contents可以正常获取了。
可这并不是解决之道。因为后面还需要用到更多的curl操作。
看到开发文档里面有一个地方写证书操作需要libcurl 7.20.1以上版本,然后我就一直在整服务器想把linux的php curl版本提高。最后面我是换到了另外一台windows服务器就好了。
先暂时这样吧,下次需要用的时候再调试。

第二步:获取与支付订单号id
代码如下

$unifiedOrder = new UnifiedOrder_pub();
   
  //var_dump($unifiedOrder);
  //设置统一支付接口参数
  //设置必填参数
  //appid已填,商户无需重复填写
  //mch_id已填,商户无需重复填写
  //noncestr已填,商户无需重复填写
  //spbill_create_ip已填,商户无需重复填写
  //sign已填,商户无需重复填写
  $unifiedOrder->setParameter("openid","$openid");//商品描述
  $unifiedOrder->setParameter("body","贡献一分钱");//商品描述
  //自定义订单号,此处仅作举例
  $timeStamp = time();
  $out_trade_no = WxPayConf_pub::APPID."$timeStamp";
  $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 
  $unifiedOrder->setParameter("total_fee","1");//总金额
  $unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址 
  $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
  //非必填参数,商户可根据实际情况选填
  //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号 
  //$unifiedOrder->setParameter("device_info","XXXX");//设备号 
  //$unifiedOrder->setParameter("attach","XXXX");//附加数据 
  //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
  //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 
  //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 
  //$unifiedOrder->setParameter("openid","XXXX");//用户标识
  //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
 
 
  $prepay_id = $unifiedOrder->getPrepayId();
   
  //echo 'prepay_id:';
  var_dump($prepay_id);

这一步也遇到非常多的问题。
首先微信支付测试比较困难,只有在微信内才可以测试。我就用手机刷来刷去。
其次使用var_dump调试也不好使额。打印一些 xml格式的文件只显示字符长度,不显示内容。于是用log的形式写在服务器上调试,log代码:
代码如下

// 打印log
  function log_d($word) 
  {
    $log_name="./logd.log";//log文件路径
    $fp = fopen($log_name,"a");
    flock($fp, LOCK_EX) ;
    fwrite($fp,"执行日期:".strftime("%Y-%m-%d-%H:%M:%S",time())."n".$word."nn");
    flock($fp, LOCK_UN);
    fclose($fp);
  }

在demo里面的 WxPayPubHelper.php 里面 用 $this->log_d(xxx);调用。
刚开始的时候由于给我的mchid和 appid不匹配一直报错。。是他们给错我账号了。刚开始我也不懂乱试。这一步的调试在 getPrepayId()内 var_dump($this->result); 就能看到错误代码。

第三步:生成支付前端 js代码就绪到网页上:
代码如下

$jsApi->setPrepayId($prepay_id);
 
$jsApiParameters = $jsApi->getParameters();

———————-点击前往支付————————-

这部分又遇到了问题:
android返回“System:Access_denied”,ios返回”access_control:not_allowed”
搜了很多百度。其实早就看到了这个东西一直没注意!
发起授权请求的页面必须是在授权目录下的页面,而不能是存在与子目录中。否则会返回错误
支付文件我放在了/域名/pay/demo/
刚开始的时候我一直是到/域名/pay/结尾以为就可以了。支持子目录,结果是不行的!。
—————————最后看下图—————

wxpay1
wxpay3
wxpay2
 

—————–流程中的xmljs——————–
待提交生成与支付订单id:
代码如下

<xml>
 <openid><![CDATA[ou9dHt0L8qFLI1foP-kj5x1mDWsM]]></openid>
 <body><![CDATA[贡献一下]]></body>
 <out_trade_no><![CDATA[wx88888888888888881414411779]]></out_trade_no>
 <total_fee>1</total_fee>
 <notify_url><![CDATA[http://shanmao.me/wxpay/notify_url.php]]></notify_url>
 <trade_type><![CDATA[JSAPI]]></trade_type>
 <appid><![CDATA[wx8888888888888888]]></appid>
 <mch_id>10012345</mch_id>
 <spbill_create_ip><![CDATA[61.50.221.43]]></spbill_create_ip>
 <nonce_str><![CDATA[60uf9sh6nmppr9azveb2bn7arhy79izk]]></nonce_str>
 <sign><![CDATA[2D8A96553672D56BB2908CE4B0A23D0F]]></sign>
</xml>

提交后返回正确,其中包含了perpay_id:

<xml>
 <return_code><![CDATA[SUCCESS]]></return_code> 
 <return_msg><![CDATA[OK]]></return_msg> 
 <appid><![CDATA[wx8888888888888888]]></appid> 
 <mch_id><![CDATA[10012345]]></mch_id> 
 <nonce_str><![CDATA[Be8YX7gjCdtCT7cr]]></nonce_str> 
 <sign><![CDATA[885B6D84635AE6C020EF753A00C8EEDB]]></sign> 
 <result_code><![CDATA[SUCCESS]]></result_code> 
 <prepay_id><![CDATA[wx201410272009395522657a690389285100]]></prepay_id> 
 <trade_type><![CDATA[JSAPI]]></trade_type> 
</xml>

生成支付用的js :

{
  "appId": "wx8888888888888888",
  "timeStamp": "1414411784",
  "nonceStr": "gbwr71b5no6q6ne18c8up1u7l7he2y75",
  "package": "prepay_id=wx201410272009395522657a690389285100",
  "signType": "MD5",
  "paySign": "9C6747193720F851EB876299D59F6C7D"
}

支付成功后返回的通知xml:

<xml><appid><![CDATA[wx8888888888]]></appid>
<bank_type><![CDATA[CCB_DEBIT]]></bank_type>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[1011111]]></mch_id>
<nonce_str><![CDATA[38gt0ffgsvfsdfsdfbt1981duv63p7]]></nonce_str>
<openid><![CDATA[o4p3SjfdsfdsfdsdCE5Y2XHw4]]></openid>
<out_trade_no><![CDATA[wx4b56d1fsdfdsf416643247]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[356EfsdfdsfsdsfE69509EDA344]]></sign>
<sub_mch_id><![CDATA[10018826]]></sub_mch_id>
<time_end><![CDATA[20141122160122]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[100715001020fsdfsd1220006123174]]></transaction_id>
</xml>

这其中的数据我随意了的,大家就参考下格式吧。另外注意大小写敏感。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP Token(令牌)设计
Mar 15 PHP
简单的PHP留言本实例代码
May 09 PHP
php长字符串定义方法
Jul 12 PHP
关于php正则匹配汉字的方法介绍
Apr 25 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
PHP中变量引用与变量销毁机制分析
Nov 15 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
PHP实现的方程求解示例分析
Nov 11 PHP
IOS 开发之NSDictionary转换成JSON字符串
Aug 14 PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
laravel框架中视图的基本使用方法分析
Nov 23 PHP
比较完整的微信开发php代码
Aug 02 #PHP
微信利用PHP创建自定义菜单的方法
Aug 01 #PHP
php微信浏览器分享设置以及回调详解
Aug 01 #PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 #PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
Aug 01 #PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 #PHP
利用PHP自动生成印有用户信息的名片
Aug 01 #PHP
You might like
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
PHP文件操作实例总结
2016/09/27 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
python多线程共享变量的使用和效率方法
2019/07/16 Python
python 字段拆分详解
2019/12/17 Python
浅谈Python 函数式编程
2020/06/20 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
python中四舍五入的正确打开方式
2021/01/18 Python
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
中医专业职业生涯规划书范文
2014/01/04 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
项目经理任命书范本
2014/06/05 职场文书
节约用水的口号
2014/06/20 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
个人党性锻炼总结
2015/03/05 职场文书
自我评价优缺点范文
2015/03/11 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers