PHP tp5 微信支付

news/2024/11/24 11:57:18/

在php中实现微信支付,我们需要准备设置以下东西:

1、appid(微信开放平台上的应用id)

2、mch_id(微信申请成功之后邮件中的商户id)

3、notify_url(支付成功后的回调地址)

4、api_key(在微信商户平台上自己设定的api密钥 32位)

5、apiclient_cert.pem 和 apiclient_key.pem 证书

接下来直接上代码(可复制粘贴,修改以上的参数及可使用):

<?php
namespace app\api\controller;
use think\Db;class Wxpay{/*微信支付配置参数*/private $config = array('appid' => "你的微信开放平台上的应用id",    /*微信开放平台上的应用id*/'mch_id' => "你的微信申请成功之后邮件中的商户id",   /*微信申请成功之后邮件中的商户id*/'api_key' => "你的在微信商户平台上自己设定的api密钥",    /*在微信商户平台上自己设定的api密钥 32位*/'notify_url' => '回调地址',);//微信支付下单public function wxpay($body,$orderid, $out_trade_no, $total_fee, $type){$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";$data["appid"]            = $this->config["appid"];$data["body"]             = '艺商城-'.$body;$data["mch_id"]           = $this->config['mch_id'];$data["nonce_str"]        = $this->createNoncestr();$data["notify_url"]       = $this->config["notify_url"];$data['trade_type']       = 'APP';$data["total_fee"]        = "1";//"$total_fee"$data["out_trade_no"]     = $out_trade_no;$data["spbill_create_ip"] = $this->get_client_ip();$sign                     = $this->getSign($data);$data["sign"]             = $sign;$xml      = $this->arrayToXml($data);$response = $this->postXmlCurl($xml, $url);$response = $this->xmlToArray($response);$response = $this->two_sign($response, $data["nonce_str"]);//返回数据echo json_encode(['status'=>1,'indo'=>'success','orderid'=>$orderid,'data'=>$response]);}//微信支付回调地址--商品支付public function wxNotifyUrl(){$type = 3;$this->payCommom($type);}/*** [payCommom 充值公共方法]* @param  [type] $type []* @return [type]       [description]*/public function payCommom($type){$xml_data = file_get_contents('php://input');$re = $this->wx_verification($xml_data);$flow_sn = $re['transaction_id'];//获取流水号if($re['code'] == 1){$data  = $this->xmlToArray($xml_data);// 启动事务Db::startTrans();try{#你的订单业务逻辑....// 提交事务Db::commit(); } catch (\Exception $e) {// 回滚事务Db::rollback();}}}echo "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";}/*** 微信支付退款* $pay_sn      支付单号* $total_fee   订单金额* $refund_fee  退款金额*/public function wxrefundOrder($pay_sn, $total_fee, $refund_fee){$url = "https://api.mch.weixin.qq.com/secapi/pay/refund";$data["appid"]            = $this->config["appid"];$data["mch_id"]           = $this->config['mch_id'];$data["nonce_str"]        = $this->createNoncestr();$data['out_trade_no']     = $pay_sn;$data['out_refund_no']    = $pay_sn;$data["total_fee"]        = intval($total_fee * 100);$data["refund_fee"]       = intval($refund_fee * 100);$sign                     = $this->getSign($data);$data["sign"]             = $sign;$xml      = $this->arrayToXml($data);$response = $this->postXmlCurl($xml, $url);$response = $this->xmlToArray($response);  if ($response['return_code'] == 'SUCCESS' && $response['refund_id']) {return ['code'=>1,'refund_id'    => $response['refund_id']];}else{return ['code'=>0,'err_code_des' => $response['err_code_des']];}}/*** [order_record 订单记录]* @return [type] [description]*/public function order_record($orderid, $unionid, $title, $price, $user_money){$record['orderid'] = $orderid; $record['unionid'] = $unionid; $record['title'] = $title; $record['price'] = $price;$record['money'] = $user_money;$record['addtime'] = time();Db::name('order_record')->insert($record);}//微信支付二次签名public function two_sign( $response = NULL, $nonce_str){if( $response != NULL && $response['return_code'] != 'SUCCESS'){return [];}else{//接收微信返回的数据,传给APP!$arr =array('appid'     => $this->config["appid"],'partnerid' => $this->config['mch_id'],'prepayid'  => $response['prepay_id'],'package'   => 'Sign=WXPay','noncestr'  => $nonce_str,'timestamp' => time(),);//第二次生成签名$sign = $this->getSign($arr);$arr['sign'] = $sign;return $arr;}}//微信支付签名public function getSign($Obj){foreach ($Obj as $k => $v){$Parameters[$k] = $v;}//签名步骤一:按字典序排序参数ksort($Parameters);$String = $this->formatBizQueryParaMap($Parameters, false);// echo '【string1】:'.$String.'</br>';//签名步骤二:在string后加入KEY$String = $String."&key=".$this->config['api_key'];// echo "【string2】".$String."</br>";//签名步骤三:MD5加密$String = md5($String);// echo "【string3】 ".$String."</br>";//签名步骤四:所有字符转为大写$result_ = strtoupper($String);// echo "【result】 ".$result_."</br>";return $result_;}/***  作用:产生随机字符串,不长于32位*/public function createNoncestr( $length = 32 ){$chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str ="";for ( $i = 0; $i < $length; $i++ )  { $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str;}/*获取当前服务器的IP*/public function get_client_ip(){if ($_SERVER['REMOTE_ADDR']) {$cip = $_SERVER['REMOTE_ADDR'];} elseif (getenv("REMOTE_ADDR")) {$cip = getenv("REMOTE_ADDR");} elseif (getenv("HTTP_CLIENT_IP")) {$cip = getenv("HTTP_CLIENT_IP");} else {$cip = "unknown";}return $cip;}//数组转xmlpublic function arrayToXml($arr){$xml = "<xml>";foreach ($arr as $key=>$val){if (is_numeric($val)){$xml.="<".$key.">".$val."</".$key.">";}else{$xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; }}$xml.="</xml>";return $xml;}/***  作用:将xml转为array*/public function xmlToArray($xml){  //将XML转为array       $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);   return $array_data;}/***  作用:以post方式提交xml到对应的接口url*/public function postXmlCurl($xml,$url,$second=30){  //初始化curl       $ch = curl_init();//设置超时curl_setopt($ch, CURLOPT_TIMEOUT, $second);  //这里设置代理,如果有的话//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);curl_setopt($ch,CURLOPT_URL, $url);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//设置headercurl_setopt($ch, CURLOPT_HEADER, FALSE);  //要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//post提交方式curl_setopt($ch, CURLOPT_POST, TRUE);curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//默认格式为PEM,可以注释curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');//退款证书curl_setopt($ch,CURLOPT_SSLCERT,PUBLIC_PATH.'/wx/apiclient_cert.pem');//默认格式为PEM,可以注释curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');//退款证书curl_setopt($ch,CURLOPT_SSLKEY,PUBLIC_PATH.'/wx/apiclient_key.pem');//运行curl$data = curl_exec($ch);//返回结果if($data){curl_close($ch);return $data;}else{$error = curl_errno($ch);echo "curl出错,错误码:$error"."<br>";curl_close($ch);return false;}}/***  作用:格式化参数,签名过程需要使用*/public function formatBizQueryParaMap($paraMap, $urlencode){$buff = "";ksort($paraMap);foreach ($paraMap as $k => $v){if($urlencode){$v = urlencode($v);}$buff .= $k . "=" . $v . "&";}$reqPar;if (strlen($buff) > 0){$reqPar = substr($buff, 0, strlen($buff)-1);}return $reqPar;}//微信支付回调验证public function wx_verification($xml_data){$data = $this->xmlToArray($xml_data);$sign = $data['sign'];unset($data['sign']);if($sign == $this->getSign($data)){if ($data['result_code'] == 'SUCCESS') {$arr=['code'=>1];}else{$arr=['code'=>0,'msg'=>$data['return_msg']];}}else{$arr=['code'=>0,'msg'=>'签名验证失败']; }return $arr;}
}

 


http://www.ppmy.cn/news/200284.html

相关文章

php,tp5 微信小程序支付v2

php&#xff0c;tp5 微信小程序支付v2 一.配置小程序相关工作 &#xff08;[v2文档](https://pay.weixin.qq.com/wiki/doc/api/index.html)&#xff09;​1.整理小程序引用文件目录2.修改配置文件 二.统一下单接口1.下单获取prepay_id2.判断返回值&#xff0c;并返回给小程序端…

Apache POI简介

Apache POI是什么&#xff1f; Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 基本功能 HSSF 提供读写Microsoft Excel格式档案的功能。 XSSF 提供读写Microsoft Excel OOXML格式档案的功能。 HW…

Apache POI 入门·第一话

文章目录 1 摘要2 Apache POI2.1 介绍2.2 应用场景2.3 入门案例2.3.1 将数据写入Excel文件2.3.1.1 导入POI maven坐标2.3.1.2 代码开发2.3.1.3 实现效果 2.3.2 读取Excel文件中的数据2.3.3 实现效果 2.4 开发案例——导出运营数据Excel报表2.4.1 产品原型2.4.2 接口设计2.4.3 代…

百度Apollo5.5版本安装教程

百度Apollo5.5版本安装教程 Apollo安装过程概述Apollo安装过程 Apollo安装过程概述 Apollo 5.5增强了先前Apollo版本中复杂的城市道路自动驾驶能力&#xff0c;支持城市到城市之间的自动驾驶功能。    推荐的机器配置&#xff1a;4核CPU&#xff0c;8GB内存&#xff08;Apoll…

百度 Apollo2.0

P4-AI生态开放战略 先向大家介绍一下百度做自动驾驶的背景。就像百度总裁COO陆奇在CES大会上讲的&#xff0c;可能不少朋友已经了解到了——百度已经是一家AI公司。 我们可以看到科技大潮的演进&#xff0c;已经从命令行、客户端服务器、互联网、移动互联网一路走来&#xff…

微信h5支付(php版) 2019

1. 登录商户平台-->产品中心-->我的产品-->支付产品-->H5支付&#xff08;申请开通&#xff09;&#xff0c; 平台地址&#xff1a;https://pay.weixin.qq.com/index.php/core/home/login?return_url%2Findex.php&#xff0c; 2. 直接上代码&#xff0c;一个php…

Apache POI基本介绍---入门级

POI介绍 ApachePOI是用Java编写的免费开源的跨平台的JavaAPI&#xff0c;ApachePOI提供API给Java程序对MicrosoftOffice格式档案读和写的功能&#xff0c;其中使用最多的就是使用POI操作Excel文件。 maven坐标&#xff1a; <dependency><groupId>org.apache.poi<…

a59s刷机包卡刷 oppo_OPPO A59S刷机包下载|OPPO A59S刷机包官方下载-太平洋下载中心...

刷机包教程: 1、下载安装线刷宝以及对应机型的ROM包。 点击下载 最新版线刷宝刷机工具,下载安装。 1.1 更改安装路径 软件截图1 1.2 正在安装 软件截图2 1.3 安装完成 软件截图3 2、连接手机,在首页按照实际情况点击按钮。 软件截图4 3、点击“选择本地ROM”,选择相匹配的线…