php微信支付步骤(PHP实现微信提现企业付款到零钱)
类别:编程学习 浏览量:636
时间:2022-01-14 02:55:57 php微信支付步骤
PHP实现微信提现企业付款到零钱怎么开通企业付款到零钱?
有的商户号的产品中心是没有这个功能的,不过,该功能的pid(product id)是5,只要随便进去某一个产品,在地址栏把pid改为5。
即可进入该功能页面,进行开通,不过要满足条件。
用户提现代码:
|
//用户微信提现 private function withdrawals_weixin( $id ){ $falg = M( 'withdrawals' )->where([ 'id' => $id ])->find(); $openid = M( 'users' )->where( 'user_id' , $falg [ 'user_id' ])->value( 'openid' ); $data [ 'openid' ] = $openid ; $data [ 'pay_code' ] = $falg [ 'id' ]. $falg [ 'user_id' ]; $data [ 'desc' ] = '提现ID' . $falg [ 'id' ]; if ( $falg [ 'taxfee' ] >= $falg [ 'money' ]){ return array ( 'status' =>1, 'msg' => "提现额度必须大于手续费!" ); } else { $data [ 'money' ] = bcsub( $falg [ 'money' ], $falg [ 'taxfee' ], 2); } include_once PLUGIN_PATH . "payment/weixin/weixin.class.php" ; $weixin_obj = new \weixin(); $result = $weixin_obj ->transfer( $data ); return $result ; } |
其中pay_code在商户号的提现功能是唯一的,所以为了防重放攻击,这个值千万不能用随机数,最好用ID,具有提现记录唯一。
提现逻辑代码:
|
// 微信提现转账 function transfer( $data ){ header( "Content-type: text/html; charset=utf-8" ); //CA证书及支付信息 $wxchat [ 'appid' ] = WxPayConfig:: $appid ; $wxchat [ 'mchid' ] = WxPayConfig:: $mchid ; $wxchat [ 'api_cert' ] = PLUGIN_PATH. '/payment/weixin/cert/apiclient_cert.pem' ; $wxchat [ 'api_key' ] = PLUGIN_PATH. '/payment/weixin/cert/apiclient_key.pem' ; // $wxchat['api_ca'] = '/plugins/payment/weixin/cert/rootca.pem'; $webdata = array ( 'mch_appid' => $wxchat [ 'appid' ], 'mchid' => $wxchat [ 'mchid' ], 'nonce_str' => md5(time()), //'device_info' => '1000', 'partner_trade_no' => $data [ 'pay_code' ], //商户订单号,需要唯一 'openid' => $data [ 'openid' ], //转账用户的openid 'check_name' => 'NO_CHECK' , //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK: //'re_user_name' => 'jorsh', //收款人用户姓名 'amount' => $data [ 'money' ] * 100, //付款金额单位为分 'desc' => $data [ 'desc' ], 'spbill_create_ip' => request()->ip(), ); foreach ( $webdata as $k => $v ) { $tarr [] = $k . '=' . $v ; } sort( $tarr ); $sign = implode( $tarr , '&' ); $sign .= '&key=' .WxPayConfig:: $key ; $webdata [ 'sign' ]= strtoupper (md5( $sign )); $wget = $this ->array2xml( $webdata ); $pay_url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers' ; $res = $this ->http_post( $pay_url , $wget , $wxchat ); if (! $res ){ return array ( 'status' =>1, 'msg' => "Can't connect the server" ); } $content = simplexml_load_string( $res , 'SimpleXMLElement' , LIBXML_NOCDATA); if ( strval ( $content ->return_code) == 'FAIL' ){ return array ( 'status' =>1, 'msg' => strval ( $content ->return_msg)); } if ( strval ( $content ->result_code) == 'FAIL' ){ return array ( 'status' =>1, 'msg' => strval ( $content ->err_code), ':' . strval ( $content ->err_code_des)); } $rdata = array ( 'mch_appid' => strval ( $content ->mch_appid), 'mchid' => strval ( $content ->mchid), 'device_info' => strval ( $content ->device_info), 'nonce_str' => strval ( $content ->nonce_str), 'result_code' => strval ( $content ->result_code), 'partner_trade_no' => strval ( $content ->partner_trade_no), 'payment_no' => strval ( $content ->payment_no), 'payment_time' => strval ( $content ->payment_time), ); return $rdata ; } |
其中 PLUGIN_PATH 是一个常量
|
define( 'PLUGIN_PATH' , __DIR__ . '/plugins/' ); |
定义插件目录
|
/** * 将一个数组转换为 XML 结构的字符串 * @param array $arr 要转换的数组 * @param int $level 节点层级, 1 为 Root. * @return string XML 结构的字符串 */ function array2xml( $arr , $level = 1) { $s = $level == 1 ? "<xml>" : '' ; foreach ( $arr as $tagname => $value ) { if ( is_numeric ( $tagname )) { $tagname = $value [ 'TagName' ]; unset( $value [ 'TagName' ]); } if (! is_array ( $value )) { $s .= "<{$tagname}>" .(! is_numeric ( $value ) ? '<![CDATA[' : '' ). $value .(! is_numeric ( $value ) ? ']]>' : '' ). "</{$tagname}>" ; } else { $s .= "<{$tagname}>" . $this ->array2xml( $value , $level + 1). "</{$tagname}>" ; } } $s = preg_replace( "/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/" , ' ' , $s ); return $level == 1 ? $s . "</xml>" : $s ; } function http_post( $url , $param , $wxchat ) { $oCurl = curl_init(); if ( stripos ( $url , "https://" ) !== FALSE) { curl_setopt( $oCurl , CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt( $oCurl , CURLOPT_SSL_VERIFYHOST, FALSE); } if ( is_string ( $param )) { $strPOST = $param ; } else { $aPOST = array (); foreach ( $param as $key => $val ) { $aPOST [] = $key . "=" . urlencode( $val ); } $strPOST = join( "&" , $aPOST ); } curl_setopt( $oCurl , CURLOPT_URL, $url ); curl_setopt( $oCurl , CURLOPT_RETURNTRANSFER, 1); curl_setopt( $oCurl , CURLOPT_POST, true); curl_setopt( $oCurl , CURLOPT_POSTFIELDS, $strPOST ); if ( $wxchat ){ curl_setopt( $oCurl ,CURLOPT_SSLCERT, $wxchat [ 'api_cert' ]); curl_setopt( $oCurl ,CURLOPT_SSLKEY, $wxchat [ 'api_key' ]); curl_setopt( $oCurl ,CURLOPT_CAINFO, $wxchat [ 'api_ca' ]); } $sContent = curl_exec( $oCurl ); $aStatus = curl_getinfo( $oCurl ); curl_close( $oCurl ); if ( intval ( $aStatus [ "http_code" ]) == 200) { return $sContent ; } else { return false; } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/qq_36602939/article/details/91399977
您可能感兴趣
- 织梦cms漏洞大全(织梦CMS利用php正则让文章的外链自动加nofollow)
- wordpress的静态php页面在哪(如何让PHPnow支持wordpress静态化链接的方法)
- php开发中用什么模板(PHP模版引擎原理、定义与用法实例)
- vuephp后台开发框架(Vue+thinkphp5.1+axios实现文件上传)
- php可以一次下载几个文件(php实现大文件断点续传下载实例代码)
- php运行机制与原理(PHP进阶学习之类的自动加载机制原理分析)
- php查找文件存在(php判断目录存在的简单方法)
- phpcurl详解(解决PHP curl或file_get_contents下载图片损坏或无法打开的问题)
- dedecms验证码识别(dedecms 软件下载频道防盗链php代码)
- 宝塔面板与php(宝塔面板如何安装PHP扩展)
- thinkphp返回json(thinkphp5框架实现数据库读取的数据转换成json格式示例)
- php7.4编译安装(PHP7.3.10编译安装教程)
- php7 入门(php7新特性的理解和比较总结)
- php设置上传文件代码(PHP大文件切割上传并带进度条功能示例)
- php系统转换的三种方式(PHP容器类的两种实现方式示例)
- php判断类的属性的修饰(PHP whois查询类定义与用法示例)
- 如何看待美国数十万加仑牛奶倒下水道 历史又重演了(如何看待美国数十万加仑牛奶倒下水道)
- 历史惊人的相似,美国80万加仑牛奶倒入下水道,意味着什么(历史惊人的相似)
- 美国数十万加仑牛奶倒进下水道,世界会重演1929年的大萧条吗(美国数十万加仑牛奶倒进下水道)
- 美国数十万加仑牛奶倒入下水道,贫民区食不果腹,历史再次重演(美国数十万加仑牛奶倒入下水道)
- 美国倒掉数十万加仑牛奶 上热搜第一,这一幕似曾相识(美国倒掉数十万加仑牛奶)
- 深度 倒牛奶 这一幕为何又在美国上演(深度倒牛奶)
热门推荐
- vueclass和style绑定(Vue中Class和Style实现v-bind绑定的几种用法)
- mysql常见错误提示及解决办法(MYSQL 无法识别中文的永久解决方法)
- 如何在windows上搭建ftp服务器(Windows Server 2016如何搭建部署FTP服务器)
- sqlserverdatetime时区(解析SQL Server中datetimeset转换datetime类型问题)
- python怎么操作mysql(详解Python的数据库操作pymysql)
- dockernextcloud优化(docker+nextcloud搭建个人云存储系统的实现)
- python读写文件实验心得(Python文件读写常见用法总结)
- linux磁盘分区创建步骤(Linux parted磁盘分区实现步骤解析)
- mongodb python教程(python使用pymongo操作mongo的完整步骤)
- python元组汇总(Python数据类型之Tuple元组实例详解)