当前位置: 首页 > 后端技术 > PHP

一个PHP文件搞定微信支付系列企业支付

时间:2023-03-29 17:16:30 PHP

网上很多PHP微信支付接入教程比较复杂,需要配置和导入的文件比较多。整理好后给个单档版的。希望能给大家想要接入微信支付带来一些帮助和参考。直接运行文件即可向指定的微信用户转账。注意事项:1.微信企业支付变更需要凭证。需要到https://pay.weixin.qq.com账户中心->账户设置->API安全->下载证书,然后修改证书路径2中的代码,这个文件需要放在支付授权目录,可在微信支付商户平台->产品中心->开发配置中设置。3、如果提示签名错误,可以通过微信支付签名验证工具进行验证:https://pay.weixin.qq.com/wik...4、错误代码参考:https://pay.weixin.qq.com/wik...代码如下:账户设置->API安全->下载证书,在207行和210行修改证书路径*2.错误码参考:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2*/header('Content-type:text/html;Charset=utf-8');$mchid='xxxxx';//微信支付商户IDPartnerID微信支付商户信息验证通过后通过邮件发送$appid='xxxxx';//微信支付应用对应公众号的APPID$appKey$appKey='xxxxx';//微信支付应用对应公众号的APPKey$apiKey='xxxxx';//https://pay.weixin.qq.com账户设置-安全设置-API安全-APIKey-设置APIKey//①获取当前访问页面用户的openid(如果转账到指定的用户,直接填写指定用户的openid)$wxPay=newWxpayService($mchid,$appid,$appKey,$apiKey);$openId=$wxPay->GetOpenid();//获取openidif(!$openId)exit('获取openid失败');//②②,支付$outTradeNo=uniqid();//订单号$payAmount=1;//转账金额,单位:元。最低转账金额为1元$trueName='张三';//收款人真实姓名$result=$wxPay->createJsBizPackage($openId,$payAmount,$outTradeNo,$trueName);echo'success';classWxpayServiceprotected$appKey;受保护的$apiKey;公共$数据=空;公共函数__construct($mchid,$appid,$appKey,$key){$this->mchid=$mchid;$this->appid=$appid;$this->appKey=$appKey;$this->apiKey=$key;}/***通过跳转获取用户的openid,跳转过程如下:*1.设置自己需要调用的url等参数会跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize*2.微信服务处理完成后,会跳转回用户redirect_uri地址。这时,带上一些参数,比如:code*@returnuser'sopenid*/publicfunctionGetOpenid(){//通过code获取openidif(!isset($_GET['code'])){//触发微信返回代码code$scheme=$_SERVER['HTTPS']=='on'?'https://':'http://';$baseUrl=urlencode($scheme.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);$url=$this->__CreateOauthUrlForCode($baseUrl);Header("地址:$url");出口();}else{//获取code获取openid$code=$_GET['code'];$openid=$this->getOpenidFromMp($code);返回$openid;}}/***通过代码从工作平台获取openid机器access_token*@paramstring$code微信跳转代码回来*@returnopenid*/publicfunctionGetOpenidFromMp($code){$url=$this->__CreateOauthUrlForOpenid($code);$res=self::curlGet($url);//取出openid$data=json_decode($res,true);$this->data=$data;$openid=$data['openid'];返回$openid;}/***构造url地址获取open和access_toke*@paramstring$code,微信跳转带回的code*@return请求的url*/privatefunction__CreateOauthUrlForOpenid($code){$urlObj["appid"]=$this->appid;$urlObj["秘密"]=$this->appKey;$urlObj["代码"]=$代码;$urlObj["grant_type"]="authorization_code";$bizString=$this->ToUrlParams($urlObj);return"https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;}/***构造url连接获取code*@paramstring$redirectUrl微信服务器重定向的url,需要url编码*@returnreturnstructureokurl*/privatefunction__CreateOauthUrlForCode($redirectUrl){$urlObj["appid"]=$this->appid;$urlObj["redirect_uri"]="$redirectUrl";$urlObj["response_type"]="代码";$urlObj["scope"]="snsapi_base";$urlObj["state"]="STATE"."#wechat_redirect";$bizString=$this->ToUrlParams($urlObj);return"https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;}/***连接的签名字符串*@paramarray$urlObj*@return返回连接的字符串*/privatefunctionToUrlParams($urlObj){$buff="";foreach($urlObj作为$k=>$v){if($k!="sign")$buff.=$k.“=”。$v。"&";}$buff=trim($buff,"&");返回$buff;}/***企业支付*@paramstring$openid调用【网页授权获取用户信息】接口获取用户在本公众号下的Openid*@paramfloat$totalFee支付总费用的单位*@paramstring$outTradeNo唯一订单号*@paramstring$orderName订单名称*@paramstring$notifyUrl支付结果通知url不带问号*@paramstring$timestamp支付时间*@returnstring*/publicfunctioncreateJsBizPackage($openid,$totalFee,$outTradeNo,$trueName){$config=array('mch_id'=>$this->mchid,'appid'=>$this->appid,'key'=>$this->apiKey,);$unified=array('mch_appid'=>$config['appid'],'mchid'=>$config['mch_id'],'nonce_str'=>self::createNonceStr(),'openid'=>$openid,'check_name'=>'FORCE_CHECK',//验证用户名选项NO_CHECK:不验证实名,FORCE_CHECK:强验证实名're_user_name'=>$trueName,//收款用户实名(不支持向非实名用户汇款)'partner_trade_no'=>$outTradeNo,'spbill_create_ip'=>'127.0.0.1','amount'=>intval($totalFee*100),//单位转换为美分'desc'=>'payment',//企业支付操作说明);$unified['sign']=self::getSign($unified,$config['key']);$responseXml=$this->curlPost('https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers',self::arrayToXml($unified));$unifiedOrder=simplexml_load_string($responseXml,'SimpleXMLElement',LIBXML_NOCDATA);if($unifiedOrder===false){die('解析xml错误');}if($unifiedOrder->return_code!='SUCCESS'){die($unifiedOrder->return_msg);}if($unifiedOrder->result_code!='SUCCESS'){die($unifiedOrder->err_code);}变真;}publicstaticfunctioncurlGet($url='',$options=array()){$ch=curl_init($url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_TIMEOUT,30);如果(!empty($options)){curl_setopt_array($ch,$options);}//https请求验证书和主机curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);$data=curl_exec($ch);curl_close($ch);返回$数据;}publicfunctioncurlPost($url='',$postData='',$options=array()){if(is_array($postData)){$postData=http_build_query($postData);}$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_POST,1);curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);curl_setopt($ch,CURLOPT_TIMEOUT,30);//设置cURL允许执行的最大秒数if(!empty($options)){curl_setopt_array($ch,$options);}//https请求不验证证书和主机curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//第一种方法,cert和key分别属于两个.pem文件//默认格式为PEM,可以注释curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');//默认格式为PEM,可以注释curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');//第二种方式,两个文件合并成一个.pem文件//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');$data=curl_exec($ch);curl_close($ch);返回$数据;}publicstaticfunctioncreateNonceStr($length=16){$chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';$str='';我<$长度;$i++){$str.=substr($chars,mt_rand(0,strlen($chars)-1),1);}返回$str;}publicstaticfunctionarrayToXml($arr){$xml="";foreach($arras$key=>$val){if(is_numeric($val)){$xml.="<".$键。“>”。$瓦尔。“”;}否则$xml.="<"。$键。">”;}$xml.="";返回$xml;}publicstaticfunctiongetSign($params,$key){ksort($params,SORT_STRING);$unSignParaString=self::formatQueryParaMap($params,false);$signStr=strtoupper(md5($unSignParaString."&key=".$key));返回$signStr;}受保护的静态函数formatQueryParaMap($paraMap,$urlEncode=false){$buff="";ksort($paraMap);foreach($paraMapas$k=>$v){if(null!=$v&&"null"!=$v){if($urlEncode){$v=urlencode($v);}$buff.=$k.“=”。$v。"&";}}$reqPar='';如果(strlen($buff)>0){$reqPar=substr($buff,0,strlen($buff)-1);}返回$reqPar;}}?>github下载地址:https://github.com/dedemao/we...相关文章:PHP文件处理微信支付系列原创支付(扫码支付)PHP文件处理微信支付系列原创公众号支付微信支付系列的PHP文件现金红包