ci =& get_instance(); $this->ci->config->load("wechat", true); } public function response_to_wx($response_arr=null) { if ($response_arr===null) { echo ""; } $response_body = $this->to_xml($response_arr); echo $response_body; return false; } /** * 转发到微信客服 * @param string $text * @param string $to_user * @param string $from_operator */ public function response_customer_service($text=null, $to_user=null, $from_operator=null) { $content_arr = $text===null ? null : array( "ToUserName" => $to_user, "FromUserName" => $from_operator, "CreateTime" => time(), "MsgType" => "transfer_customer_service", "Content" => $text ); return $this->response_to_wx($content_arr); } public function response_text($text=null, $to_user=null, $from_operator=null) { $content_arr = $text===null ? null : array( "ToUserName" => $to_user, "FromUserName" => $from_operator, "CreateTime" => time(), "MsgType" => "text", "Content" => $text ); return $this->response_to_wx($content_arr); } /** * 开发者认证token * @param array $input:微信的GET请求数据 */ public function auth_signature($input, $token) { $s = $input["signature"]; $t = $input["timestamp"]; $n = $input["nonce"]; $e = $input["echostr"]; $tmpArr = array($t, $n, $token); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); // $ee = 'V3xwtddYXPES064KgVh0uxqfPVV2qDK1HvfX7PIRvxR'; ob_clean(); if( $s == $tmpStr ){ echo $e; }else{ echo ""; } return false; } public function call_wechat($wechat_host, $url, $get_data=array(), $post_data=null) { $this->wechat_host = $wechat_host; $this->wechat_config = $this->ci->config->item($wechat_host, 'wechat'); if ( false === array_key_exists('code', $get_data)) { $access_token = $this->get_access_token(); $get_data = array_merge($get_data, array("access_token" => $access_token) ); } $url = $this->ci->config->item('url_domain', 'wechat') . $url . "?" . http_build_query($get_data); $curl = curl_init(); curl_setopt($curl, CURLOPT_FAILONERROR, false); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 20); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 20); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_URL, $url); if ($post_data !== null) { curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); } $output = curl_exec($curl); if (curl_errno($curl)) { log_message('error', "curl error code: ".curl_error($curl)."; curl postBodyString: ".$post_data); } else { $httpStatusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if (200 !== $httpStatusCode) { log_message('error', "Request html Status Code: ".$httpStatusCode."; curl postBodyString: ".$post_data); } $output_arr = json_decode($output, true); if (false !== stripos($output, "errcode") && 0 !== intval($output_arr['errcode']) ) { log_message('error','wechat reponse error:' . var_export($output, 1)); curl_close($curl); return null; } } curl_close($curl); return $output; } private function get_access_token() { $url = $this->ci->config->item('url_domain', 'wechat') . "/cgi-bin/token?grant_type=client_credential&appid=" . $this->wechat_config['app_id'] . "&secret=" . $this->wechat_config['app_secret']; $curl = curl_init(); curl_setopt($curl, CURLOPT_FAILONERROR, false); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 20); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 20); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_URL, $url); $output = curl_exec($curl); if (curl_errno($curl)) { log_message('error', "curl error code: ".curl_error($curl)); } else { $httpStatusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if (200 !== $httpStatusCode) { log_message('error', "Request html Status Code: ".$httpStatusCode); } $output_arr = json_decode($output, true); if (false !== stripos($output, "errcode") && 0 !== intval($output_arr['errcode']) ) { log_message('error','wechat reponse error:' . var_export($output, 1)); curl_close($curl); return null; } } curl_close($curl); $access_token_arr = json_decode($output, true); return $access_token_arr['access_token']; } /** * 发送文本消息给已关注用户 * 当用户和公众号产生特定动作的交互时, 允许在48小时内调用此接口发送消息给用户 * 允许的<特定动作> * * 用户发送信息 * * 点击自定义菜单(仅有点击推事件、扫码推事件、扫码推事件且弹出“消息接收中”提示框这3种菜单类型是会触发客服接口的) * * 关注公众号 * * 扫描二维码 * * 支付成功 * * 用户维权 * @param [type] $wechat_host * @param 用户openid $to_user * @param 文本内容 $text */ public function send_text_customer($wechat_host, $to_user, $text) { $url = "/cgi-bin/message/custom/send"; $post = array( "touser" => $to_user, "msgtype" => "text", "text" => array( "content" => $text ) ); return $this->call_wechat($wechat_host, $url, [], json_encode($post, JSON_UNESCAPED_UNICODE)); } /** * 已下单未支付 * @param [type] $wechat_host * @param [type] $openid * @param array $order */ public function push_book_ok($wechat_host, $openid, $order=array()) { $this->ci->load->model('Wechat_service_model'); $url = "/cgi-bin/message/template/send"; $order_detail_path = "/order" . "/" .$order['orderTour'][0]['coli'] . "/" . $order['orderTour'][0]['orderId']; $post = array( "touser" => $openid, "template_id" => 'eSnnOFczriQFJSPy4q7797iKi4HCh6im5vP8iLlIHAU', "url" => 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx7e605820faf98a05&redirect_uri=http%3A%2F%2Ftrippest.mycht.cn%2Fapi%2Findex.php%2Fwechat-mp%2Flogin-now%2Ftrippest%3Fl%3D' . urlencode($order_detail_path) . '&response_type=code&scope=snsapi_base&state=detail#wechat_redirect', "topcolor" => '#173177', "data" => array( "first" => array( "value" => 'Thanks for booking with Trippest. Click to follow up the payment now.', "color" => '#173177' ), "OrderID" => array( "value" => 'Booking Reference # ' . $order['orderTour'][0]['orderId'], "color" => '#173177' ), "PkgName" => array( "value" => $order['orderTour'][0]['tourName'], "color" => '#173177' ), "TakeOffDate" => array( "value" => 'Tour Date ' . date('M.d, Y', strtotime($order['orderTour'][0]['startDate'])), "color" => '#173177' ), "Remark" => array( "value" => 'For more information…', "color" => '#173177' ) ), ); $this->call_wechat($wechat_host, $url, [], json_encode($post, JSON_UNESCAPED_UNICODE)); $push_arr = array( "wp_wu_id" => $order['wechat']['wu_id'], "wp_msgtype" => "template", "wp_content" => json_encode($post['data'], JSON_UNESCAPED_UNICODE), "wp_templateid" => $post['template_id'], "wp_templatename" => "旅游订单待支付", "wp_createtime" => date('Y-m-d H:i:s'), "wp_wc_id" => $order['wechat']['wc_id'] ); $this->ci->Wechat_service_model->insert_wechat_push($push_arr); return true; } /** * 行程即将开始 * 导游司机等调度信息 * @param [type] $wechat_host * @param [type] $openid * @param array $order */ public function push_arrangement($wechat_host, $openid, $order=array()) { $this->ci->load->model('Wechat_service_model'); $url = "/cgi-bin/message/template/send"; $order_detail_path = "/order" . "/" .$order['orderTour'][0]['coli'] . "/" . $order['orderTour'][0]['orderId']; $post = array( "touser" => $openid, "template_id" => 'wqfkOjDe5VpJn1hYC2lhO3w2qQ96o-a1ylt0wl9-1JE', "url" => 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx7e605820faf98a05&redirect_uri=http%3A%2F%2Ftrippest.mycht.cn%2Fapi%2Findex.php%2Fwechat-mp%2Flogin-now%2Ftrippest%3Fl%3D' . urlencode($order_detail_path) . '&response_type=code&scope=snsapi_base&state=detail#wechat_redirect', "topcolor" => '#173177', "data" => array( "first" => array( "value" => 'Booking Reference # ' . $order['orderTour'][0]['orderId'], "color" => '#173177' ), "keyword1" => array( "value" => $order['orderTour'][0]['tourName'], "color" => '#173177' ), "keyword2" => array( "value" => 'Start Date: ' . $order['orderTour'][0]['startDate'], "color" => '#173177' ), "remark" => array( "value" => 'Tap this card to find more details.', // TODO: Guide:北京禹昭Helen, Mobile:15333241912 "color" => '#173177' ) ), ); $this->call_wechat($wechat_host, $url, [], json_encode($post, JSON_UNESCAPED_UNICODE)); $push_arr = array( "wp_wu_id" => $order['wechat']['wu_id'], "wp_msgtype" => "template", "wp_content" => json_encode($post['data'], JSON_UNESCAPED_UNICODE), "wp_templateid" => $post['template_id'], "wp_templatename" => "行程即将开始", "wp_createtime" => date('Y-m-d H:i:s'), "wp_wc_id" => $order['wechat']['wc_id'] ); $this->ci->Wechat_service_model->insert_wechat_push($push_arr); return true; } public function push_wechat_paid($wechat_host, $payment=array(), $order=array() ) { $this->ci->load->model('Wechat_service_model'); $url = "/cgi-bin/message/template/send"; $order_detail_path = "/order" . "/" .$order['orderTour'][0]['coli'] . "/" . $order['orderTour'][0]['orderId']; bcscale(2); $total_fee = bcdiv($payment['total_fee'], $this->ci->config->item('currency_unit', 'wechat')); $post = array( "touser" => $payment['openid'], "template_id" => '2ar2YEdmcylhGJr2e6C9SLresnCWMLfDK8RPr2caj04', "url" => 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx7e605820faf98a05&redirect_uri=http%3A%2F%2Ftrippest.mycht.cn%2Fapi%2Findex.php%2Fwechat-mp%2Flogin-now%2Ftrippest%3Fl%3D' . urlencode($order_detail_path) . '&response_type=code&scope=snsapi_base&state=detail#wechat_redirect', "topcolor" => '#173177', "data" => array( "first" => array( "value" => 'Payment successful and your booking is confirmed.', "color" => '#173177' ), "keyword1" => array( "value" => $order['orderTour'][0]['leader'], "color" => '#173177' ), "keyword2" => array( "value" => 'BR# ' . $order['orderTour'][0]['orderId'], "color" => '#173177' ), "keyword3" => array( "value" => 'Total payment ' . $payment['fee_type'] . $total_fee, "color" => '#173177' ), "keyword4" => array( "value" => $order['orderTour'][0]['tourName'], "color" => '#173177' ), "remark" => array( "value" => 'You’ll receive a notice about guides/driver info at the night before tour started.', "color" => '#173177' ) ), ); $this->call_wechat($wechat_host, $url, [], json_encode($post, JSON_UNESCAPED_UNICODE)); $push_arr = array( "wp_wu_id" => $order['wechat']['wu_id'], "wp_msgtype" => "template", "wp_content" => json_encode($post['data'], JSON_UNESCAPED_UNICODE), "wp_templateid" => $post['template_id'], "wp_templatename" => "支付成功", "wp_createtime" => date('Y-m-d H:i:s'), "wp_wc_id" => $order['wechat']['wc_id'] ); $this->ci->Wechat_service_model->insert_wechat_push($push_arr); return true; } /** * 格式化参数格式化成url参数 */ public function to_url_params($xml_arr) { $buff = ""; foreach ($xml_arr as $k => $v) { if($k != "sign" && $v != "" && !is_array($v)){ $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; } /** * 输出xml字符 * @throws WxPayException **/ function to_xml($arr) { if(!is_array($arr) || count($arr) <= 0) { return false; } $xml = ""; foreach ($arr as $key=>$val) { if (is_numeric($val)){ $xml.="<".$key.">".$val.""; }else{ $xml.="<".$key.">"; } } $xml.=""; return $xml; } /** * 将xml转为array * @param string $xml * @throws WxPayException */ function from_xml($xml) { if(!$xml){ return false; } //将XML转为array //禁止引用外部xml实体 libxml_disable_entity_loader(true); return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); } } /* End of file Wechat_lib.php */