array( "wxopenid"=> $revFromOpenId,"ddh" => $orderId,"fpqqlsh" => $fpqqlsh, "nsrsbh" => "91440300MA5ED5C341","nsrmc"=> "深圳市志云天计算机技术有限公司", "nsrdz"=> "深圳市南山区南头街道南山数字文化产业基地裙楼2楼3A", "nsrdh"=> "4000 361 360","nsrbank"=> "中国工商银行股份有限公司深圳宝中支行","nsrbankid"=> "4000104009100129368", "ghfnsrsbh"=> "","ghfmc"=> "许可","ghfdz"=> "","ghfdh"=> "","ghfbank"=> "","ghfbankid"=>"", "kpr" => "管理员","skr"=> "管理员","fhr"=> "管理员","jshj"=> "1.03","hjje"=> "1.00","hjse"=> "0.03","bz"=> "","hylx"=> "0", "invoicedetail_list" => array( array( "fphxz"=> "0","spbm"=> "3040201030000000000","xmmc"=> "软件维护服务","dw"=> "","ggxh"=>"","xmsl"=>"1","xmdj"=> "1.00","xmje"=> "1.00","sl"=> "0.03","se"=>"0.03" ) ), ) ); * * * getAuthURL 的$params * $params = array( "order_id" => "1234", "money" => 11, // 以分为单位 "source" => "web", // 开票来源,app:app开票,web:微信h5开票,wxa:小程序开发票,wap:普通网页开票 "redirect_url" => "https://mp.weixin.qq.com", "type": 1, //授权类型,0:开票授权,1:填写字段开票授权,2:领票授权 ) * * clearCardTpl 的$params * logo_url 和title 必填 * $params = array( "invoice_info"=> array( "base_info"=>array( "logo_url"=> "http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZJkmG8xXhiaHqkKSVMMWeN3hLut7X7hicFNjakmxibMLGWpXrEXB33367o7zHN0CwngnQY7zb7g/0", "title"=> "xx公司", "custom_url_name"=> "xyz", "custom_url"=> "xyz", "custom_url_sub_title"=>"xyz", "promotion_url_name"=> "puname", "promotion_url"=> "purl", "promotion_url_sub_title"=> "ptitle", ), "type" => " 广东省增值税普通发票 ", "payee" => " 测试 - 收款方 ", ) * ) * * * * * @package common\exts\wechat */ class WxInvoice { const INVOICE_API_URL_PREFIX = 'https://api.weixin.qq.com'; const SET_URL = '/card/invoice/seturl?'; const SET_CONTACT = '/card/invoice/setbizattr?'; const GET_AUTH_URL ='/card/invoice/getauthurl?'; const CREATE_CARD_TPL = '/card/invoice/platform/createcard?'; const MAKE_INVOICE = '/card/invoice/makeoutinvoice?'; const CLEAR_OUT_INVOICE = '/card/invoice/clearoutinvoice?'; const QUERY_INVOICE = '/card/invoice/queryinvoceinfo?'; const GET_AUTH_DATA = "/card/invoice/getauthdata?"; const COMMERCIAL_ID = '9444ee'; //商户识别号 微信电子发票那里获取 const S_PAPPID = 'd3hlZGY2OTZlZGRiMGIwM2YwX8c5w43vO9QvbNKSjI2KBuEHMd3vBhSbw4/mGKz7G+VW'; // 微信电子发票那里获取 static $errcode = 0; static $errmsg = ''; /** 获取微信提供的商品类型 * @param int $index * @return array */ public static function getWxGoodsCode($index = 0) { $gArray = array( 0 => array('id'=> "3040201030000000000", 'name' => '软件维护服务', 'rate' => 0.03), ); if ( isset($gArray[$index])) { return $gArray[$index]; } else { return $gArray; } } public static function getInvoiceSetUrl($appId, $appSecret) { $access_token = AccessToken::get($appId, $appSecret); if (!$access_token) return false; $params = '{}'; $url = self::INVOICE_API_URL_PREFIX. self::SET_URL. "access_token={$access_token}"; $result = Http::post($url,$params); if ($result) { $json_arr = json_decode($result, true); self::$errcode = $json_arr['errcode']; self::$errmsg = $json_arr['errmsg']; if (0 == $json_arr['errcode'] && 'ok' == $json_arr['errmsg']) { return $json_arr['invoice_url']; } else { return ''; } } return false; } /** 设置商户联系方式。 * @param $appId * @param $appSecret * @param int $expire * @return bool */ public static function setContact($appId, $appSecret, $expire = 1800) { $access_token = AccessToken::get($appId, $appSecret); if (!$access_token) return false; $url = self::INVOICE_API_URL_PREFIX . self::SET_CONTACT."action=set_contact&access_token={$access_token}"; $params = array('contact' => array("phone" => "4000 361 360", "time_out" => $expire)); $result = Http::post($url, PHPSDK::json_encode($params)); if ($result) { $json_arr = json_decode($result, true); self::$errcode = $json_arr['errcode']; self::$errmsg = $json_arr['errmsg']; if (0 == $json_arr['errcode'] && 'ok' == $json_arr['errmsg']) { return true; } else { return false; } } return false; } /** 获取商家联系方式 * @param $appId * @param $appSecret * @return bool */ public static function getContact($appId, $appSecret) { $access_token = AccessToken::get($appId, $appSecret); if (!$access_token) return false; $url = self::INVOICE_API_URL_PREFIX . self::SET_CONTACT."action=get_contact&access_token={$access_token}"; $result = Http::post($url, '{}'); if ($result) { $json_arr = json_decode($result, true); self::$errcode = $json_arr['errcode']; self::$errmsg = $json_arr['errmsg']; if (0 == $json_arr['errcode'] && 'ok' == $json_arr['errmsg']) { return $json_arr['contact']; } else { return false; } } return false; } /** 获取授权页 * @param $appId * @param $appSecret * @param $params * @return bool|string */ public static function getAuthURL($appId, $appSecret, $params) { $access_token = AccessToken::get($appId, $appSecret); if (!$access_token) { return false; } $params['ticket'] = WxTicket::getWxCardTicket($appId, $appSecret); $params['s_pappid'] = self::S_PAPPID; $params['timestamp'] = time(); $url = self::INVOICE_API_URL_PREFIX . self::GET_AUTH_URL."access_token={$access_token}"; $result = Http::post($url, PHPSDK::json_encode($params)); if ($result) { $json_arr = json_decode($result, true); self::$errcode = $json_arr['errcode']; self::$errmsg = $json_arr['errmsg']; if (0 == $json_arr['errcode'] && 'ok' == $json_arr['errmsg']) { return $json_arr['auth_url']; } else { return ''; } } return false; } /** 查询授权完成状态 * @param $appId * @param $appSecret * @param $params = array('order_id' => $order_id); //'s_pappid'=>$s_pappid, * @return bool|mixed|string * * 若用户填入的是个人抬头: { "errcode": 0,"errmsg": "ok","invoice_status": "auth success","auth_time": 1480342498, "user_auth_info": { "user_field": { "title": "Dhxhhx ","phone": "5554545","email": "dhxhxhhx@qq.cind", "custom_field": [{"key": "field1","value": "管理理论"}] } } } 若用户填入的是单位抬头: { "errcode": 0,"errmsg": "ok","invoice_status": "auth success","auth_time": 1480342897, "user_auth_info": { "biz_field": { "title": "xx公司","tax_no": "6464646766","addr": "xx大厦","phone": "1557548768","bank_type": "xx银行","bank_no": "545454646", "custom_field": [{"key": "field2","value": "哈哈哈啊"}] } } } * */ public static function getAuthData($appId, $appSecret, $params) { $access_token = AccessToken::get($appId, $appSecret); if (!$access_token) { return false; } $params['s_pappid'] = self::S_PAPPID; $url = self::INVOICE_API_URL_PREFIX . self::GET_AUTH_DATA."access_token={$access_token}"; $result = Http::post($url, PHPSDK::json_encode($params)); if ($result) { $json_arr = json_decode($result, true); self::$errcode = $json_arr['errcode']; self::$errmsg = $json_arr['errmsg']; if ( 0 == $json_arr['errcode'] && 'ok' == $json_arr['errmsg'] ) { return $json_arr; } else { return ''; } } return false; } /** 创建发票模板 * @param $appId * @param $appSecret * @param $params * @return bool|string * return * { "errcode": 0, "errmsg": "ok", "card_id": "pjZ8Yt9WoOePThU0NfUKz5-tBEWU" } * 用户公众号 的logo_url 为[ "media_id" => "OiLrbltmwUcecAs6zkpllIgof83VuKgNYiXvt3HT1ZQ" ,"url" => "http://mmbiz.qpic.cn/mmbiz_jpg/iavrxzR4PicoXWn4lopWic5eiaQVONQhdia5brhEhCgTVq54cVEWKrw7sia8WEKEM4tfobonQo68aPwSXBjrE8ZkNhIA/0?wx_fmt=jpe"】 */ public static function createCardTpl($appId, $appSecret, $params) { $access_token = AccessToken::get($appId, $appSecret); if (!$access_token) return false; $url = self::INVOICE_API_URL_PREFIX . self::CREATE_CARD_TPL."access_token={$access_token}"; $result = Http::post($url, PHPSDK::json_encode($params)); if ($result) { $json_arr = json_decode($result, true); self::$errcode = $json_arr['errcode']; self::$errmsg = $json_arr['errmsg']; if (0 == $json_arr['errcode'] && 'ok' == $json_arr['errmsg']) { return $json_arr['card_id']; } else { return ''; } } return false; } /** 统一开票接口-开具蓝票 * @param $appId * @param $appSecret * @param $params * @return bool|mixed */ private static function makeInvoiceApi($appId, $appSecret, $params) { $access_token = AccessToken::get($appId, $appSecret); if (!$access_token) { return false; } $url = self::INVOICE_API_URL_PREFIX . self::MAKE_INVOICE."access_token={$access_token}"; $result = Http::post($url, PHPSDK::json_encode($params));WxLog::init();WxLog::DEBUG('=== makeInvoiceApi ===:'.$result); if ($result) { $json_arr = json_decode($result, true); self::$errcode = $json_arr['errcode']; self::$errmsg = $json_arr['errmsg']; if (0 == $json_arr['errcode']) { return true; } else { return $json_arr; } } return false; } /** 开蓝票接口 * @param $appId * @param $appSecret * @param $params = array('openid'=> '', 'orderId'=>'', 'ghfmc'=> '', 'ghfnsrsbh' => 'jshj'=>'', 'fpqqlsh'=>'',) * 公司 'ghfmc' 和 'ghfnsrsbh' 必填 * @return \stdClass */ public static function makeInvoice($appId, $appSecret, $params) { WxLog::init(); $e = new \stdClass(); $e->success = false; $e->error = 'ok'; $e->fpqqlsh = null; $tt = time(); if ( !isset($params['fpqqlsh']) || empty($params['fpqqlsh']) ) { $params['fpqqlsh'] = self::COMMERCIAL_ID . $tt . mt_rand(1,1000); } else { $pre = substr($params['fpqqlsh'], 0, 6); if (self::COMMERCIAL_ID != $pre ) { $params['fpqqlsh'] = self::COMMERCIAL_ID . $params['fpqqlsh']; } } if (empty($params['ghfmc']) || !isset($params['ghfmc'])) { $e->error = 'ghfmc'; return $e; } if (empty($params['jshj']) || !isset($params['jshj'])) { $e->error = 'jshj'; return $e; } if ($params['jshj'] < 0) { $e->error = '-jshj'; return $e; } $goods = self::getWxGoodsCode(); $params['ghfnsrsbh'] = isset($params['ghfnsrsbh'])?$params['ghfnsrsbh']:''; $params['ghfdz'] = isset($params['ghfdz'])?$params['ghfdz']:''; $params['ghfdh'] = isset($params['ghfdh'])?$params['ghfdh']:''; $params['ghfbank'] = isset($params['ghfbank'])?$params['ghfbank']:''; $params['ghfbankid'] = isset($params['ghfbankid'])?$params['ghfbankid']:''; $params['bz'] = isset($params['bz'])?$params['bz']:''; $hjje = round($params['jshj']/(1+$goods['rate']),2); $hjse = $params['jshj'] - $hjje; $apiParams = array( "invoiceinfo" => array( "wxopenid" => $params['openid'], "ddh" => $params['orderId'], "fpqqlsh" => $params['fpqqlsh'], "nsrsbh" => InvoiceApi::SELF_COMPANY_TAX_ID, "nsrmc" => InvoiceApi::SELF_COMPANY_NAME, "nsrdz" => InvoiceApi::SELF_COMPANY_ADDRESS, "nsrdh" => InvoiceApi::SELF_COMPANY_TEL, "nsrbank" => InvoiceApi::SELF_COMPANY_BANK_NAME, "nsrbankid" => InvoiceApi::SELF_COMPANY_BANK_ID, "ghfnsrsbh" => $params['ghfnsrsbh'], "ghfmc" => $params['ghfmc'], "ghfdz" => $params['ghfdz'], "ghfdh" => $params['ghfdh'], "ghfbank" => $params['ghfbank'], "ghfbankid" => $params['ghfbankid'], "kpr" => "管理员", "skr" => "管理员", "fhr" => "管理员", "jshj" => sprintf("%.2f", round($params['jshj'], 2)), "hjje" => sprintf("%.2f", $hjje), "hjse" => sprintf("%.2f", $hjse), "bz" => $params['bz'], "hylx" => "0", "invoicedetail_list" => array( array( "fphxz" => "0", "spbm" => $goods['id'], "xmmc" => $goods['name'], "dw" => "", "ggxh" => "", "xmsl" => "1", "xmdj" => sprintf("%.2f", $hjje), "xmje" => sprintf("%.2f", $hjje), "sl" => $goods['rate'], "se" => sprintf("%.2f", $hjse) ) ), ) ); $result = self::makeInvoiceApi($appId, $appSecret, $apiParams); //WxLog::DEBUG('make out invoice data '. json_encode($params)); $e->success = true; $e->fpqqlsh = $params['fpqqlsh']; $e->result = $result; return $e; } /** 统一开票接口-发票冲红 * @param $appId * @param $appSecret * @param $params = array('invoiceinfo'=>array("wxopenid"=>"os92LxEDbiOw7kWZanRN_Bb3Q45I", "fpqqlsh"=>"test20160511000400", "yfpdm"=>"050003521100","yfphm"=>"30329969")) //"nsrsbh"=>"110109500321654","nsrmc"=>"百旺电子测试1", * @return bool|mixed */ public static function clearOutInvoice($appId, $appSecret, $params) { $access_token = AccessToken::get($appId, $appSecret); if (!$access_token) return false; $params['nsrmc'] = InvoiceApi::SELF_COMPANY_NAME; $params['nsrsbh'] = InvoiceApi::SELF_COMPANY_TAX_ID; $url = self::INVOICE_API_URL_PREFIX . self::CLEAR_OUT_INVOICE."access_token={$access_token}"; $result = Http::post($url, PHPSDK::json_encode($params)); if ($result) { $json_arr = json_decode($result, true); self::$errcode = $json_arr['errcode']; self::$errmsg = $json_arr['errmsg']; if (0 == $json_arr['errcode']) { return true; } else { return $json_arr; } } return false; } /** 统一开票接口-查询已开发票 * @param $appId * @param $appSecret * @param $fpqqlsh 发票请求流水号,唯一查询发票的流水号 * @param $nsrsbh 纳税人识别码 * @return bool|mixed * * {"errcode": 0,"errmsg": "发票数据获取成功", "invoicedetail": { "fpqqlsh": "14574d75004451097845","fpdm": "088978450417","fphm": "21590001","jym": "59004166725791147047","kprq": "20171204172159","pdfurl": "http://weixin.com" } } */ public static function queryInvoice($appId, $appSecret, $fpqqlsh, $nsrsbh) { $access_token = AccessToken::get($appId, $appSecret); if (!$access_token) return false; $params = array('fpqqlsh'=> $fpqqlsh, 'nsrsbh' => $nsrsbh); $url = self::INVOICE_API_URL_PREFIX . self::QUERY_INVOICE."access_token={$access_token}"; $result = Http::post($url, PHPSDK::json_encode($params)); if ($result) { $json_arr = json_decode($result, true); self::$errcode = $json_arr['errcode']; self::$errmsg = $json_arr['errmsg']; if (0 == $json_arr['errcode'] ) { return $json_arr; } else { return false; } } return false; } }