第一次做微信支付(网页版本的),折腾了两天,记录一下方便下次自己再次使用,也希望能帮和我一样初次接触的朋友踩一下坑。
前期准备
1.开通微信认证服务号,并且开通商户平台
2.下载微信支付dome,下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1,解压php版本如图
a.doc文件夹说明文档 b.example一些dome示例 c.lib最重要的文件接口文件 d.logs日志文件
第一步dome文件处理
1.解压后获得php_sdk_v3.0.9这个文件夹改名为WxPay整个复制到核心框架ThinkPHP\Library\Vendor中方便调用
2.打开lib文件夹下的WxPay.Api.php文件,在537行有一段curl网络请求配置代码:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
改为:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
为了禁止 cURL 验证证书
3.打开example中的WxPay.Config.php配置GetAppId函数和GetMerchantId两项(一个是公众号APPID,一个是商户号)
第二步配置公众号后台授权路径
1.网页授权路径,公众号设置->功能设置->网页授权域名(这个是为了获取用户openid的),直接填你的根目录就OK
第四步后端代码
//付款调用
public function wxpay(){
$money = abs(I('moneys'))*100; //单位为分
$openid = I('openids');
if(empty($money)){
return 0;
}
if(empty($openid)){
return 0;
}
//echo $money;
Vendor('WxPayAPI.lib.WxPay#Api');
Vendor('WxPayAPI.example.WxPay#Config');
Vendor('WxPayAPI.example.WxPay#JsApiPay');
//②、统一下单
$tools = new \JsApiPay();
$input = new \WxPayUnifiedOrder();
$input->SetBody("微信还款"); //这里是支付内容
$input->SetAttach(I('fq')); //此处可传值,待支付成功后可取这部分的值
$input->SetOut_trade_no("3".date("YmdHis")); //订单编号
$input->SetTotal_fee($money); //金额
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url("https://wechat.labao168.com/fukuan/payment.php");
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openid);
$config = new \WxPayConfig();
$order = \WxPayApi::unifiedOrder($config, $input);
$jsApiParameters = $tools->GetJsApiParameters($order);
echo $jsApiParameters;
}
这里有一个大坑要注意一下,SetNotify_url他这个配置不支持pathinfo模式,比如
https://www.xxx.com/fukuan/index.php/Home/wxpay/notify
这种模式是不支持的,解决方法如下
根目录(fukuan)中创建payment.php作为入口文件,然后跳转到相应页面
https://www.xxx.com/fukuan/payment.php
// +----------------------------------------------------------------------
// 应用入口文件
// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',True);
//指定模块控制器和方法
$_GET['m']='Home';
$_GET['c']='Wxpay';
$_GET['a']='notify';
// 定义应用目录
define('APP_PATH','./Application/');
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
// 亲^_^ 后面不需要任何代码了 就是如此简单
第五步支付成功后入库处理(这里真的是操碎了心),回调地址就是上面在商户号上配置地址,支付成功后微信服务器会访问这个地址
a.坑1这个地址是不允许有权限管理的,就是说你在网页上能直接访问,否则微信服务器无法传值到这个地址
b.坑2微信服务器为了将消息准确送到我们的服务器,会对这个地址请求多次,频率从高到低(导致一条数据被插入很多次数据库),我的解决方法比较笨,就是插入数据库之前检测一下订单是否存在,存在的话就直接跳过插入数据
c.坑3由于是服务器与服务器间的请求,无法在页面上显示,就是说你丫没办法在页面上调试,解决办法将接受到的数据写入文本中,然后查看文本是否有问题
d.传值问题,支付后端中$input->SetAttach(I('fq'));是可以传值的
where(array('tranid'=>$order_sn))->find();
if($results){
exit();
}
//更新数据库
$uid = M('user')->where(array('openid'=>$openid))->getField('id');
//判断是否满足分期
M('fqjl')->where(array('uid'=>$uid,'fq'=>$fq))->setInc('yhk',$total_fee); // 用户的积分加3
//file_put_contents('test.txt',$datast['yhk']);
$sj['money'] = $total_fee;
$sj['ztime'] = strtotime(date('Y-m-d'));
$sj['contents'] = "微信还款";
$sj['uid'] = $uid;
$sj['tranid'] = $order_sn;
//file_put_contents('test.txt',$sj);
$res = M('zhangdan')->add($sj);
echo exit(' ');
}
}
}
}
至此支付就完成了,希望有一点对第一次接触的朋友有一点小小的帮助