<?php
namespace Admin\Controller;
use Think\Controller;
/*
* 该类用于企业转账
*/
class TransController extends Controller{
private $appid = '';
private $appsecret = '';
private $mchid = '';
private $key = '';
public function _initialize(){
$paymentPlugin = M('Plugin')->where("code='weixin' and type = 'payment' ")->find(); // 找到微信支付插件的配置
$config_value = unserialize($paymentPlugin['config_value']); // 配置反序列化
$this->appid = $config_value['appid']; // * APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
$this->mchid = $config_value['mchid']; // * MCHID:商户号(必须配置,开户邮件中可查看)
$this->key = $config_value['key']; // KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)
$this->appsecret = $config_value['appsecret']; // 公众帐号secert(仅JSAPI支付的时候需要配置),
}
//企业付款调用该方法
public function trans($openID,$money,$nickname=''){
$params = array(
'partner_trade_no' => $this->createPayid(),//生成订单号
'openid' => $openID,
'check_name' => 'NO_CHECK',
'amount' => $money*100,
'desc' => $nickname.'余额提现',
);
//证书路径
$apicent_cert = CERT_PATH . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR. 'payment' . DIRECTORY_SEPARATOR . 'weixin' . DIRECTORY_SEPARATOR . 'cert' . DIRECTORY_SEPARATOR . 'apiclient_cert.pem';
$apiclient_key = CERT_PATH . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR. 'payment' . DIRECTORY_SEPARATOR . 'weixin' . DIRECTORY_SEPARATOR . 'cert' . DIRECTORY_SEPARATOR . 'apiclient_key.pem';
//$ca = WWWROOT . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR. 'payment' . DIRECTORY_SEPARATOR . 'weixin' . DIRECTORY_SEPARATOR . 'cert' . DIRECTORY_SEPARATOR . 'rootca.pem';
$res = $this->payToUser($params,$apicent_cert,$apiclient_key);
if($res->result_code=='SUCCESS'){
return true;//转账成功
}else{
$return_message = (string)$res->err_code_des;
return $return_message;
}
//获取支付结果
//dump($res);
// object(SimpleXMLElement)#7 (10) {
// ["return_code"] => string(7) "SUCCESS"
// ["return_msg"] => object(SimpleXMLElement)#8 (0) {
// }
// ["mch_appid"] => string(18) "wx6634becf2098b785"
// ["mchid"] => string(10) "1380838302"
// ["device_info"] => object(SimpleXMLElement)#9 (0) {
// }
// ["nonce_str"] => string(15) "848141333395157"
// ["result_code"] => string(7) "SUCCESS"
// ["partner_trade_no"] => string(16) "2016110909251350"
// ["payment_no"] => string(28) "1000018301201611094809686639"
// ["payment_time"] => string(19) "2016-11-09 09:25:15"
// }
}
/**
* array转xml
*/
public 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;
}
public function createNoncestr( $length = 15 ) {
$chars = "01234567890123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
/**
* 作用:使用证书,以post方式提交xml到对应的接口url
*/
public function postXmlSSLCurl($xml, $url, $second, $cert, $key){
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second ? $second : $this->timeout);
//这里设置代理,如果有的话
//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,FALSE);
//设置header
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//设置证书
//使用证书:cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,$cert);
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, $key);
//curl_setopt ($ch, CURLOPT_CAINFO, $ca);
//post提交方式
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
//file_put_contents("./nimamama",$data);
$restran = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);//解析XML到对象
//$restran = json_decode($restran,true);
return $restran;
}
else {
$error = curl_errno($ch);
echo "curl出错,错误码:$error"."<br>";
curl_close($ch);
return false;
}
}
//生成订单号(最好在其它业务里生成该订单号,传到该类需要的函数中,Powered BY UNIX8.NET)
public function createPayid()
{
return date('Ymdhis', time()) . substr(floor(microtime() * 1000), 0, 1) . rand(0, 9);
}
//企业向个人付款
public function payToUser($params, $apicent_cert, $apiclient_key) {
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
//检测必填参数
if($params["partner_trade_no"] == null) { //
exit("退款申请接口中,缺少必填参数partner_trade_no!"."<br>");
}elseif($params["openid"] == null){
exit("退款申请接口中,缺少必填参数openid!"."<br>");
}elseif($params["check_name"] == null){ //NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
exit("退款申请接口中,缺少必填参数check_name!"."<br>");
}elseif(($params["check_name"] == 'FORCE_CHECK' or $params["check_name"] == 'OPTION_CHECK') && ($params["re_user_name"] == null)){ //收款用户真实姓名。
exit("退款申请接口中,缺少必填参数re_user_name!"."<br>");
}elseif($params["amount"] == null){
exit("退款申请接口中,缺少必填参数amount!"."<br>");
}elseif($params["desc"] == null){
exit("退款申请接口中,缺少必填参数desc!"."<br>");
}
$params["mch_appid"] = $this->appid;//公众账号ID
$params["mchid"] = $this->mchid;//商户号
$params["nonce_str"] = $this->createNoncestr();//随机字符串
$params['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'] == '::1' ? '192.127.1.1' : $_SERVER['REMOTE_ADDR'];//获取IP
$params["sign"] = $this->getSign($params);//获取签名
$xml = $this->arrayToXml($params);
return $this->postXmlSSLCurl($xml, $url, false, $apicent_cert, $apiclient_key);
}
public function formatBizQueryParaMap($paraMap, $urlencode)
{
//var_dump($paraMap);//die;
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v)
{
if($urlencode)
{
$v = urlencode($v);
}
//$buff .= strtolower($k) . "=" . $v . "&";
$buff .= $k . "=" . $v . "&";
}
$reqPar;
if (strlen($buff) > 0)
{
$reqPar = substr($buff, 0, strlen($buff)-1);
}
//var_dump($reqPar);//die;
return $reqPar;
}
/**
* 作用:生成签名
*/
public function getSign($Obj)
{
//var_dump($Obj);//die;
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->key;
//echo "【string2】".$String."</br>";
//签名步骤三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."</br>";
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
//echo "【result】 ".$result_."</br>";
return $result_;
}
}
?>相关推荐
微信公众号支付签名生成工具类和xml转换工具类和双向验证请求工具类
微信公众号支付签名生成工具类和xml和map转换工具类和双向验证请求工具类
简析SoBit 跨链桥图文教程
1.在您的网络浏览器中启动SoBit Bridge应用程序。2.选择SoBit界面右上角的比特币网络来连接您的数字钱包。从下拉菜单中选择’BTC’作为源链,’SOL’(Solana)作为目标链。在’数量’字段中指定您希望桥接的BRC20代币数量。确保您的钱包中有足够的余额。如果适用,勾选框以确认服务不适用于美国个人和实体。跟随钱包提示选择合适的铭刻费用。做好准备,Unisat/OKX钱包将要求确认两次。当铭刻成功时,在您的钱包中确认并支付交易。一旦转移启动,将生成一个交易ID。
企业微信PHP-SDK(ThinkPHP5.*版本)
这是企业微信的PHP-SDK,根据需要改写成ThinkPHP5.*版本下的extend拓展库格式,只需按照Tp5的extend第三方类库方法加载此SDK即可使用
APP在使用中出现崩溃、闪退的情况,是什么原因引起的
APP在使用中出现崩溃、闪退的情况,是什么原因引起的 一.常见的原因 1.缓存垃圾过多 由于安卓系统的特性,长时间不清理缓存,会导致越来越卡,也会出现闪退的情况 2.运行的程序过多,引起的内存不足现象 由于部分手机运行程序过多,手机本身内存比较少,容易出现闪退问题, 3.应用版本的兼容性问题 3.1应用版本兼容性问题 应用版本太低,会导致不兼容,引起闪退;有些新发布的版本,还在调试中也可能会出现闪退的问题 3.2APP中的SDK和手机的兼容性问题 4.APP中访问网络的地方部分组件未加载 组件中的Image
7系列ZYNQ硬件调试:Vitis无法识别ARM DAP的排查与解决
本文针对7系列ZYNQ开发中Vitis无法识别ARM DAP的典型硬件调试问题,提供了系统性的排查与解决方案。文章深入剖析了问题本质,指出ARM DAP无法访问的核心原因在于PS部分的电源、时钟或复位等硬件基础条件未满足,并重点强调了PS参考时钟(如33.333MHz晶振)的完整性是关键排查点。通过从电源完整性、时钟与复位信号到JTAG连接与焊接的逐步硬件排查,并结合软件配置交叉验证,为开发者提供了清晰的故障定位思路与实战指南。
CMake安装grpc生成gRPCTargets.cmake文件
以下是安装语句: cd grpc_folder git submodule update --init cmake .. make -j 4 sudo make install 然而编写依赖gRPC的程序,发现无法调用gRPC的CMake文件,错误提示如下所示: include could not find load file: /usr/local/lib/cmake/g...
tp5支付宝支付
ThinkPHP5 支付宝支付扩展库, 包括手机网站支付、电脑网站支付、支付查询、退款、退款查询、对账单等。可以在GitHub下载: https://github.com/dream2023/ThinkPHP5-alipay下载下来如下打开application文件夹把common复制到自己项目的application中打开example模块,把Notify.php复制到自己的项目的control...
Zabbix故障排查10051端口无法启动:zabbix-server.service: main process exited, code=exited, status=1/FAILURE
zabbix-server.service: main process exited, code=exited, status=1/FAILURE报错说与数据库失去连接。
php支付宝付款码支付,php支付宝APP支付功能
本文实例为大家分享了php支付宝APP支付的具体代码,供大家参考,具体内容如下支付宝网页支付1.支付宝开放平台添加应用,获得appid,并签约。2.在支付宝开放品台设置如下:3.配置支付宝的应用公钥。(根据支付宝的文档)4.在开放平台下载官方sdk demo。5.代码://支付宝include_once VENDOR_PATH . 'Alipay/aop/AopClient.php';includ...
2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单)
本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。
A*(star)算法原理讲解以及程序实现(基于Python)
本文将以迷宫探索最优路径为例,讲解A *搜索算法原理及其程序实现。在原理讲解部分,首先从为什么要使用A *搜索算法和A *搜索算法的全局最优逻辑出发,讲解A *算法的原理。其次对A *的行动函数g(n)和启发函数h(n)的细节进行了讲解说明,并补充了启发函数的选择对于A *算法的影响。在程序实现部分,首先从程序流程框图出发,解释A *算法的流程。其次按函数的类划分并讲解主要代码,接着展示程序的运行结果,最后对A *算法进行总结分析。
CTFshow SSTI
模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前。模板引擎也会提供沙箱机制来进行漏洞防范,但是可以用沙箱逃逸技术来进行绕过。SSTI 就是服务器端模板注入(Server-Side Template Injection)
基于FFT的轴承故障诊断 - MATLAB代码和详细解释
最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。因此,通过分析频谱图,我们可以识别轴承故障的特征。因此,通过分析频谱图,我们可以识别轴承故障的特征。我们可以选择适当的阈值,并在频谱图上标记异常特征。通过这种基于FFT的轴承故障诊断方法,我们可以快速、准确地检测和诊断轴承故障。接下来,我们将应用FFT来获取振动信号的频谱信息,频谱显示了信号在不同频率上的能量分布。通过将异常特征标记在频谱图上,我们可以直观地识别轴承故障的存在。
tp3.2中企业向个人微信钱包零钱付款
第一步:去商户平台账户中心->API安全下载证书会得到一个包cert. 第二步:将cert放入项目根目录下Static/Common/ 第三步:将第三方企业向个人付款类库包Weixin放入Application/Common/Libs,类库包Weixin里面目录结构如下图: 第四步:打开lib里面的WxPay.Config.php文件,证书路径如下所示: //=======【证书路径设置】
PCL CSF布料模拟算法【2026最新版】
CSF布料模拟地面滤波算法的PCL实现,博客长期更新,本文最近更新时间为:2026年10月26日。
《模型轻量化-剪枝蒸馏量化系列》YOLOv5无损剪枝(附源码)
无损剪枝模型到几百kb~
tp5微信开发(五)--- tp5微信企业付款到零钱开发实践
项目需求:客户有一个分销项目,需要对分享获得的奖励直接发放至客户零钱钱包。 开发文档传送门:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1 企业付款到用户零钱开通条件: 1、商户号(或同主体其他非服务商商户号)已入驻90日 2、商户号(或同主体其他非服务商商户号)有30天连续正常交易 ...
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
tp5中使用easywechat完成企业付款到用户微信钱包
第一步:使用composer工具在框架中安装easywechat,并将证书放在框架根目录cert里(如果没该目录,则新建一个) 第二步:在控制器中使用: 类开始的时候引入: use EasyWeChat\Factory; 方法中使用: $rootPath = ROOT_PATH; $config = [ // 必要配置 'app_id' =&g...
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
PHP微信商户支付企业付款到零钱功能
一 开通条件,就是首先要在微信平台设置好。 以下微信文档里有的,我这里大概掠几项比较重要的。 付款资金 企业付款到零钱资金使用商户号余额资金。 根据商户号的账户开通情况,实际出款账户有做区别: ◆ 默认情况下,企业付款到零钱使用商户号基本户(或余额账户)余额。如商户号已开通运营账户,则企业付款到零钱使用运营账户内的资金。 ◆ 基本户(或上述其他出款账户)的资金来源,...
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
tp5 微信企业付款到零钱
tp5 微信企业付款到零钱
微信开发系列----企业付款到银行卡接口开发
一、微信商户号须开通此功能; 二、应用环境TP5+Mysql+Centos三、编写代码3.1、Model层,Wechat.php <?php namespace app\home\model; use think\Cache; class Wechat extends Model { private $appid; ...
tp5微信提现
【代码】tp5微信提现。
TP5微信提现 商家转账到零钱(复制皆可用)
TP5提现,对接商家转账到零钱。(复制皆可用)
1497



被折叠的 条评论
为什么被折叠?



