微信支付之企业付款至微信用户钱包无需sdk

微信开发 1166浏览 评论

在如今的网络时代,用我们四川老话说就是求钱不带,跑得风块!

但是:我有手机啊!

好吧,你赢了!

事实如此,现在不管去哪里都有手机一键支付,微信,支付宝,银联。

在前面我们说了如何对接微信支付(你付钱给商家)。

现在起我们来说企业如何付款给你(也就是用户体现功能)很常见哈。

我们需要对接微信公众号提供的企业付款到零钱的接口,这个接口不含SDK

想偷懒的朋友还是另寻他门儿,比如说当你看到这篇文章的时候,恭喜你不用

再去读哪坑爹,复杂的接口文档了,不用编写复杂的程序了!

废话不多说直接上代码

<?php
namespace app\extra;
use think\Controller;

class Wechat extends Controller {

 protected $appid='your appID';
 protected $appsecret = 'your appsecret';
 protected $mchid='';


    /**
     * @param $openid  微信用户的openid
     * @param $money.  支付金额
     * @param $trade_no 商户订单号
     * @param $desc  描述
     * @return array
     * 企业付款
     */
 public function mchPay($openid,$money,$trade_no,$desc){
 $data = array(
 'mch_appid' => $this->appid,
 'mchid'     => $this->mchid,
 'nonce_str' => self::getNonceStr(), //随机字符串
 'partner_trade_no' => $trade_no,
 'openid'    => $openid,
 'check_name'=> 'NO_CHECK',             //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:
 'amount'    => $money * 100,         //付款金额单位为分
 'desc'      => $desc,
 'spbill_create_ip' => getIp()
        );

 //生成签名
 $data['sign'] = self::makeSign($data);

 //构造XML数据
 $xmldata = self::array2xml($data);
 $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
 //发送post请求
 $res = self::curl_post_ssl($url, $xmldata);
 if(!$res){
 return array('status'=>0, 'msg'=>"Can't connect the server" );
        }
 // 这句file_put_contents是用来查看服务器返回的结果 测试完可以删除了
        //file_put_contents('./log1.txt',$res,FILE_APPEND);

        //付款结果分析
 $content = self::xml2array($res);
 if(strval($content['return_code']) == 'FAIL'){
 return array('status'=>0, 'msg'=>strval($content['return_msg']));
        }
 if(strval($content['result_code']) == 'FAIL'){
 return array('status'=>0, 'msg'=>strval($content['err_code']).':'.strval($content['err_code_des']));
        }

 return $content;
    }

 /**
     * @param $arr
     * @param int $level
     * @return mixed|string
     * 数组转xml
     */

 protected 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;
    }

 /**
     * @param $xml
     * @return mixed
     * xml转数组
     */
 protected function xml2array($xml){
 //禁止引用外部xml实体
 libxml_disable_entity_loader(true);
 $result= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
 return $result;
    }

 /**
     * @param int $length
     * @return string
     * 生成随机字符串
     */
 protected function getNonceStr($length = 32) {
 $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
 $str ="";
 for ( $i = 0; $i < $length; $i++ )  {
 $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
        }
 return $str;
    }

 /**
     * @param $data
     * @return string
     * 生成加密串
     */
 protected function makeSign($data){
 //获取微信支付秘钥
 $key = '你的支付密钥';
 // 去空
 $data=array_filter($data);
 //签名步骤一:按字典序排序参数
 ksort($data);
 $string_a=http_build_query($data);
 $string_a=urldecode($string_a);
 //签名步骤二:在string后加入KEY
        //$config=$this->config;
 $string_sign_temp=$string_a."&key=".$key;
 //签名步骤三:MD5加密
 $sign = md5($string_sign_temp);
 // 签名步骤四:所有字符转为大写
 $result=strtoupper($sign);
 return $result;
    }

 /**
     * @param $url
     * @param $xmldata
     * @param int $second
     * @param array $aHeader
     * @return bool|mixed
     * 发起支付
     */
 protected function curl_post_ssl($url, $xmldata, $second=30,$aHeader=array()){
 $ch = curl_init();
 //超时时间
 curl_setopt($ch,CURLOPT_TIMEOUT,$second);
 curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
 //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
        //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,0);
 curl_setopt($ch, CURLOPT_SSLVERSION, 1);

 //默认格式为PEM,可以注释
 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
 curl_setopt($ch,CURLOPT_SSLCERT,ROOT_PATH.'extend/wxpay/cert/apiclient_cert.pem');
 //默认格式为PEM,可以注释
 curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
 //传入证书,自己下载就可以了
 curl_setopt($ch,CURLOPT_SSLKEY,ROOT_PATH.'extend/wxpay/cert/apiclient_key.pem');

 //curl_setopt($ch,CURLOPT_CAINFO,$config['rootca']);

 if( count($aHeader) >= 1 ){
 curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }

 curl_setopt($ch,CURLOPT_POST, true);
 curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata);
 $data = curl_exec($ch);
 if($data){
 curl_close($ch);
 return $data;
        }else {
 $error = curl_errno($ch);
 echo "call faild, errorCode:$error\n";
 curl_close($ch);
 return false;
        }
    }

}

方法调用

$ch_pay = new Wechat();
$pay = $ch_pay->mchPay($user['open_id'],1,getOrderNum(),'用户提现');


总结:没什么好总结的,就是这么简单,直接拿过去用吧!复制粘贴,填几个参数即可

本文连接:http://www.phpbloger.com/article/51.html 文章都为原创,转载请注明出处!

相关文章