引用:
http://www.thinkphp.cn/code/3593.html
Github查看最新代码https://github.com/dream2023/ThinkPHP5-wxpay
原文件适合TP5.0的以下的,微信支付参数都是固定的读取
单独微信H5支付可以参考:https://blog.csdn.net/haibo0668/article/details/81273278
完整TP5.1文件包:https://download.csdn.net/download/haibo0668/10587904
重新修改的包在这里下载:https://download.csdn.net/download/haibo0668/10587914
1、修改\extend\wxpay\NativePay.php文件,修正后的代码
checkParams($params);
if(empty($params['product_id'])) {
throw new \WxPayException('商品ID(product_id)商品ID必须');
}
// 2.组装参数
$input = $that->getPostData($params);
// 3.进行请求
$tools = new \WxPayNativePay();
$result = $tools->GetPayUrl($input);
// 4.进行结果检验
$that->checkResult($result);
// 5.返回支付二维码图片
$url = urlencode($result["code_url"]);
//$payImage = $that->qrCode($url);
$payImage = "";
return $payImage;
}
// 组装请求参数
private function getPostData($params)
{
$input = new \WxPayUnifiedOrder();
$input->SetBody($params['body']);
$input->SetOut_trade_no($params['out_trade_no']);
$input->SetTotal_fee($params['total_fee']);
// $input->SetGoods_tag("test");
$input->SetNotify_url(\WxPayConfig::NOTIFY_URL);
$input->SetTrade_type("NATIVE");
$input->SetProduct_id($params['product_id']);
return $input;
}
}
重点:TP5.1不支持
use think\Loader;
Loader::import('wxpay.lib.WxPayNativePay');
引用文件,需要修改成
2、在\application\index\controller\Example.php文件中增加生成二维码函数
// 扫码支付 生成二维码后转换成图片二维码
public function qrcodeUrl()
{
require '../extend/wxpay/lib/Phpqrcode.php';//二维码
$url = urldecode(input('data'));
if(substr($url, 0, 6) == "weixin"){
$qrcode_tools = new \QRcode();
echo $qrcode_tools->png($url);
//QRcode::png($url);
}else{
echo header('HTTP/1.1 404 Not Found');
}
}
Example.php代码:
'支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
'product_id' => time(),
];
//db('order')->insert($params);
$result = \wxpay\NativePay::getPayImage($params);
echo $result;
}
// 公众号支付
public function jspay()
{
$params = [
'body' => '支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
];
$result = \wxpay\JsapiPay::getPayParams($params);
halt($result);
}
// 小程序支付
public function smallapp()
{
$params = [
'body' => '支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
];
$code = '08123gA41K4EQO1RH1B41uP2A4123gAW';
$result = \wxpay\JsapiPay::getPayParams($params, $code);
$openId = 'oCtoK0SjxW-N5qjEDgaMyummJyig';
$result = \wxpay\JsapiPay::getParams($params, $openId);
}
// 刷卡支付
public function micropay()
{
$params = [
'body' => '支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
];
$auth_code = '134628839776154108';
$result = \wxpay\MicroPay::pay($params, $auth_code);
halt($result);
}
// H5支付
public function wappay()
{
$params = [
'body' => '支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
];
$result = \wxpay\WapPay::getPayUrl($params);
halt($result);
}
// 订单查询
public function query()
{
$out_trade_no = '290000985120170917160005';
$result = \wxpay\Query::exec($out_trade_no);
halt($result);
}
// 退款
public function refund()
{
$params = [
'out_trade_no' => '290000985120170917160005',
'total_fee' => 1,
'refund_fee' => 1,
'out_refund_no' => time()
];
$result = \wxpay\Refund::exec($params);
halt($result);
}
// 退款查询
public function refundquery()
{
$order_no = '290000985120170917160005';
$result = \wxpay\RefundQuery::exec($order_no);
halt($result);
}
// 下载对账单
public function download()
{
$result = \wxpay\DownloadBill::exec('20170923');
echo($result);
}
// 通知测试
public function notify()
{
$notify = new \wxpay\Notify();
$notify->Handle();
}
// 扫码支付 生成二维码后转换成图片二维码
public function qrcodeUrl()
{
require '../extend/wxpay/lib/Phpqrcode.php';//二维码
$url = urldecode(input('data'));
if(substr($url, 0, 6) == "weixin"){
$qrcode_tools = new \QRcode();
echo $qrcode_tools->png($url);
//QRcode::png($url);
}else{
echo header('HTTP/1.1 404 Not Found');
}
}
}
本地测试是回调不了,所以上面扫码支付是测试不了回调的,需要调试回调,就要在服务器上测试
设置好正确的回调地址,所谓正确的地址必须在微信公众号设置的支付授权目录(或测试授权目录)下,且域名要和微信公众号绑定的服务器地址域名相同。
扫码支付需要回调网址的,记得填写上
然后上传服务器测试
引用:https://www.cnblogs.com/lhat/p/5611242.html
控制器代码中:
//支付
public function payment()
{
$type=input('type');//1=微信扫码 2=微信公众号 3=微信H5支付 4=支付宝PC电脑扫码 5=支付宝移动 6=银联 7=小程序支付 8=微信刷卡支付
$out_trade_no=input('WIDout_trade_no');
// $total_fee=input('WIDtotal_amount');
// $arr['WIDsubject']=input('WIDsubject');//订单名称 商品简单描述
// $arr['WIDout_trade_no']=input('WIDout_trade_no');//订单号
// $arr['WIDtotal_amount']=input('WIDtotal_amount');//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
// $arr['type']=$type;
// $arr['satat']=1;
if($type==2){//=2是微信公众号 微信公众号先不要一开始就在系统中生成订单
$this->getparams();//生成params数组
}else{
$this->getOrder();//生成订单
}
if($type==1){//微信PC扫码支付
$out_trade_no=input('WIDout_trade_no');//订单号
$this->assign('out_trade_no',$out_trade_no);
//$this->assign('number',$out_trade_no);
$params = [
'body' => input('WIDsubject'),//订单名称 商品简单描述
'out_trade_no' => input('WIDout_trade_no'),//订单号
'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
'product_id' => time(),//商品ID 可以单个商品,也可以多个商品ID,例子:12,35,58
];
// //db('order')->insert($params);
$result = \wxpay\NativePay::getPayImage($params);
echo $result;
return view(wxcodepay);
}elseif($type==2){//微信公众号
$params = [
'body' => input('WIDsubject'),//订单名称 商品简单描述
'type' => input('type'),//微信第二次转跳的时候需要带些参数回来 1=微信扫码 2=微信公众号 3=微信H5支付 4=支付宝PC电脑扫码 5=支付宝移动 6=银联 7=小程序支付 8=微信刷卡支付
'out_trade_no' => input('WIDout_trade_no'),//订单号
'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
];
$result = \wxpay\JsapiPay::getPayParams($params);
//$result = str_replace('\"', '\'', $result);
//halt($result);
$result = json_decode($result,true);//转为数组
$this->assign('result',$result);
//dump($result);die;
//return $result;
//halt($result);
return view(index);
}elseif($type==3){//微信H5支付
$params = [
'body' => input('WIDsubject'),//订单名称 商品简单描述
'out_trade_no' => input('WIDout_trade_no'),//订单号
'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
];
$result = \wxpay\WapPay::getPayUrl($params);
halt($result);
}elseif($type==4){//支付宝PC扫码支付
\alipay\Pagepay::pay($this->params);//支付宝电脑PC扫码支付
}elseif($type==5){//支付宝移动支付
\alipay\Wappay::pay($this->params);//支付宝移动支付
}elseif($type==6){//银联
}elseif($type==7){//微信小程序支付
$params = [
'body' => input('WIDsubject'),//订单名称 商品简单描述
'out_trade_no' => input('WIDout_trade_no'),//订单号
'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
];
$code = '08123gA41K4EQO1RH1B41uP2A4123gAW';
$result = \wxpay\JsapiPay::getPayParams($params, $code);
$openId = 'oCtoK0SjxW-N5qjEDgaMyummJyig';
$result = \wxpay\JsapiPay::getParams($params, $openId);
}elseif($type==8){//微信刷卡支付
$params = [
'body' => input('WIDsubject'),//订单名称 商品简单描述
'out_trade_no' => input('WIDout_trade_no'),//订单号
'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
];
$auth_code = '134628839776154108';
$result = \wxpay\MicroPay::pay($params, $auth_code);
halt($result);
}else{
$this->error('错误:请选择支付方式!');
}
}
$result = json_decode($result,true);//转为数组,模板中调用
/**
* 当TYPE=2时,即微信公众号支付时,不生成订单,生成$params
* 获取订单信息, 必须包含订单号和订单金额
*
* @return string $params['out_trade_no'] 商户订单
* @return float $params['total_amount'] 订单金额
*/
public function getparams()
{
$number=input('WIDout_trade_no');//订单号
$title=input('WIDsubject');//订单名称 商品简单描述 支付宝支付
$body=input('WIDsubject');//订单名称 商品简单描述 微信支付
$price=input('WIDtotal_amount');//总价格 如果购买多个商品,就是多个商品的总价
$type=input('type');
$state=0;//状态 0未支付 1已支付
$type_state=0;//订单类型 0单个购买 1购买多个商品
$params['type']=input('type');//支付类型 大家都有的
$params['out_trade_no']=input('WIDout_trade_no');//订单号
$params['subject']=input('WIDsubject');//订单名称 商品简单描述 支付宝支付
$params['body']=input('WIDsubject');//订单名称 商品简单描述 微信支付
$params['total_amount']=input('WIDtotal_amount');//总价格 如果购买多个商品,就是多个商品的总价
if($number && $price){
$data['number']=$number;
$data['title']=$title;
$data['price']=$price;
$data['state']=$state;
$data['type']=$type;
$data['type_state']=$type_state;
$order_rs=db('order')->insert($data);
}
$this->params = $params;
}
模板代码:两段代码一定要有才能调用微信
在微信公众号支付中,微信那个文件包文件还有修改的。因为传值的问题
JsapiPay.php
public static function getPayParams($params, $code='')
{
//$code=input('code');
$tools = new \WxPayJsPay();
//dump($params);
//$openId = $tools->GetOpenid($params);
$params2 = $tools->GetOpenid($params);
return self::getParams($params2, $params2['openid']);
//return self::getParams($params, $openId);
}
WxPayJsPay.php
public function GetOpenid($params)
{
//通过code获得openid,第一次从自己系统上过来,CODE是空的,从下面if (empty($code)){这步中,微信登录授权再转跳一次网址,带来CODE值,CODE不为空就执行$openid = $this->GetOpenidFromMp($code);这步来获取$openid
//要把参数$params传回去,不然微信第二次转跳的时候$params就变成空了
$url_params="?body=".$params['body']."&out_trade_no=".$params['out_trade_no']."&total_fee=".$params['total_fee']."&type=".$params['type'];
$code=input('code');
//dump($params);
if (empty($code)){
//if (!isset($_GET['code'])){
//触发微信返回code码
$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'].$url_params);
//$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);
//dump($baseUrl);die;
$url = $this->__CreateOauthUrlForCode($baseUrl);
//dump($url);die;
Header("Location: $url");
exit();
} else {
//获取code码,以获取openid
//dump(input('param.'));die;
$openid = $this->GetOpenidFromMp($code);
$params = [
'body' => input('body'),
'type' => input('type'),
'out_trade_no' => input('out_trade_no'),
'total_fee' => input('total_fee'),
'openid' => $openid,
];
return $params;//传数组回去,因为要带body、type、out_trade_no这些参数回去,所以只能传数组回去
//return $openid;//传一个$openid回去
}
}
微信登录公众号授权后再转跳一次,所以我加上之前的值回来。不然转跳后之前的值就变空了
完整TP5.1文件包:https://download.csdn.net/download/haibo0668/10587904
1、把微信支付包:https://download.csdn.net/download/haibo0668/10587914(还要修改一个地方,看最下面,包中没有更新)下载解压后把文件夹放到\extend\下
2、微信支付参数,\application\common.php中
//微信支付参数
function wx_confing(){
//网址
$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';////判断http还是https
$pay_url = $http_type.$_SERVER['HTTP_HOST'];
$config['APPID']='wxf33ba';//绑定支付的APPID(必须配置,开户邮件中可查看)
$config['MCHID']='148122';//商户号(必须配置,开户邮件中可查看)
$config['WXPAY_DEBUG']=true;//开发模式与生产模式 微信支付需要获取用户的真实ip, 本地开发就需要设定一个固定的IP, 处于生产模式, 请务必将次改为false, 用于获取用户真实IP!!!!
$config['NOTIFY_URL']=$pay_url.'/pay/index/notify';//异步通知地址
$config['KEY']='icpuhyk0fdgfdgddfgdl0k50q';//商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
$config['APPSECRET']='4ed12dfb65765gfhgf2972';//公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置),
//=======【证书路径设置】=====================================
/**
* TODO:设置商户证书路径
* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载,
* API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书)
* @var path
*/
$config['SSLCERT_PATH']='/wxpay/cert/apiclient_cert.pem';
$config['SSLKEY_PATH']='/wxpay/cert/apiclient_key.pem';
//=======【curl代理设置】===================================
/**
* TODO:这里设置代理机器,只有需要代理的时候才设置,不需要代理,请设置为0.0.0.0和0
* 本例程通过curl使用HTTP POST方法,此处可修改代理服务器,
* 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代理(如有需要才设置)
* @var unknown_type
*/
$config['CURL_PROXY_HOST']="0.0.0.0";//"10.152.18.220";
$config['CURL_PROXY_PORT']=0;//8080;
//=======【上报信息配置】===================================
/**
* TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】,
* 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少
* 开启错误上报。
* 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报
* @var int
*/
$config['REPORT_LEVENL']=1;//
// ======【日志文件目录】===================================
$config['WXPAY_LOG']='/wxpay';//
return $config;
}
3、控制器文件:\application\pay\controller\Wx.php (这里可以随意自己)
'支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
'product_id' => time(),
];
//db('order')->insert($params);
$result = \wxpay\NativePay::getPayImage($params);
echo $result;
}
// 公众号支付
public function jspay()
{
$params = [
'body' => '支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
];
$result = \wxpay\JsapiPay::getPayParams($params);
halt($result);
}
// 小程序支付
public function smallapp()
{
$params = [
'body' => '支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
];
$code = '08123gA41K4EQO1RH1B41uP2A4123gAW';
$result = \wxpay\JsapiPay::getPayParams($params, $code);
$openId = 'oCtoK0SjxW-N5qjEDgaMyummJyig';
$result = \wxpay\JsapiPay::getParams($params, $openId);
}
// 刷卡支付
public function micropay()
{
$params = [
'body' => '支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
];
$auth_code = '134628839776154108';
$result = \wxpay\MicroPay::pay($params, $auth_code);
halt($result);
}
// H5支付
public function wappay()
{
$params = [
'body' => '支付测试',
'out_trade_no' => mt_rand().time(),
'total_fee' => 1,
];
$result = \wxpay\WapPay::getPayUrl($params);
halt($result);
}
// 订单查询
public function query()
{
$out_trade_no = '290000985120170917160005';
$result = \wxpay\Query::exec($out_trade_no);
halt($result);
}
// 退款
public function refund()
{
$params = [
'out_trade_no' => '290000985120170917160005',
'total_fee' => 1,
'refund_fee' => 1,
'out_refund_no' => time()
];
$result = \wxpay\Refund::exec($params);
halt($result);
}
// 退款查询
public function refundquery()
{
$order_no = '290000985120170917160005';
$result = \wxpay\RefundQuery::exec($order_no);
halt($result);
}
// 下载对账单
public function download()
{
$result = \wxpay\DownloadBill::exec('20170923');
echo($result);
}
// 通知测试
public function notify()
{
//dump(wx_confing());die;
$notify = new \wxpay\Notify();
$notify->Handle();
}
// 扫码支付 生成二维码后转换成图片二维码
public function qrcodeUrl()
{
require '../extend/wxpay/lib/Phpqrcode.php';//引入生成生成二维码文件
$url = urldecode(input('data'));
if(substr($url, 0, 6) == "weixin"){
$qrcode_tools = new \QRcode();
echo $qrcode_tools->png($url);
//QRcode::png($url);
}else{
echo header('HTTP/1.1 404 Not Found');
}
}
}
一、引用微信支付文件包中:\extend\wxpay\lib\WxPayJsPay.php 还有修改,不然后收不到值
增加接收参数代码
二、修改
//$queryResult = $this->query($out_trade_no, $succResult);
$queryResult = Db::query($out_trade_no, $succResult);
在TP5之后的写法为:
读数据使用 Db::query
写数据使用 Db::execute