getFindConfig($storeid);//获取商户微信配置信息 if (empty($config)) { $data['status'] = 0; $data['msg'] = '商家支付参数未配置'; $this->ajaxReturn($data); } if ($config["status"] == 1) { $post['appid'] = $config['wx_appid']; $post['mch_id'] = $config['wx_mch_id']; $post['body'] = $config['name'] . '-' . $config['storetag']; $post['out_trade_no'] = $out_trade_no; $post['total_fee'] = $money; $post['auth_code'] = $code; $post['key'] = $config['wx_secret_key']; } else if ($config["status"] == 3) { //查询合作伙伴配置 $id = $config["merchantid"]; $partnerid = M("retail_merchant")->where(array("id" => $id))->getField("partnerid"); $cache = M("systemconfig")->where(array("partnerid" => $partnerid))->find(); $post['appid'] = $cache['wx_appid']; $post['mch_id'] = $cache['mch_id']; $post['body'] = $config['name'] . '-' . $config['storetag']; $post['out_trade_no'] = $out_trade_no; $post['total_fee'] = $money; $post['auth_code'] = $code; $post['key'] = $cache['wx_key']; $post['sub_mch_id'] = $config["wx_sub_mchid"]; if(!empty($config['wx_sub_appid'])){ $post['wx_sub_appid'] = $config['wx_sub_appid']; } file_put_contents("wxpay.txt", json_encode($post)); } else if ($config["status"] == 4) { //新大陆支付 $pays['tradeNo'] = $out_trade_no; $pays['authCode'] = $code; $pays['types'] = 2; $pays['subject'] = '测试'; $pays['amount'] = $money; $pays['total_amount'] = $money; $data = A('Pay/PayContinent')->pay($pays, $merchantid, $adminid, $storeid, $orderInfo, $orderid); } $WxPaysdk = new \Util\Wx\WxMicroPay($post); $result = $WxPaysdk->postWxMicro(); if (!empty($result) && $result['result_code'] == 'SUCCESS' && $result['return_code'] == 'SUCCESS') { //修改订单状态 $save ['trade_no'] = $result ['transaction_id']; $save ['order_state'] = 'SUCCESS'; $time = substr($result['time_end'], 0, strlen($result['time_end']) - 10) . '-' . substr($result['time_end'], -10, 2) . '-' . substr($result['time_end'], -8, 2) . ' ' . substr($result['time_end'], -6, 2) . ':' . substr($result['time_end'], -4, 2) . ':' . substr($result['time_end'], -2, 2); $save ['tradedate'] = strtotime($time); $save ['extend_content'] = json_encode($result); $PayOrderModel = D('PayOrder'); $update = $PayOrderModel->updateOrder(array('id' => $orderid), $save);//更新订单信息 if ($update) { if ($config["status"] == 3) { A('Api/Vip')->toMark($result['sub_openid'], $orderid, $money); } else { A('Api/Vip')->toMark($result['openid'], $orderid, $money); } file_put_contents('./orderid.txt', $orderid); A("Sellapi/PayRefund")->payOvers(3, $adminid, $storeid, $merchantid, $orderInfo, $orderid); $data['status'] = 1; $data['msg'] = '支付成功'; $data['out_trade_no'] = $out_trade_no; $data['mdate'] = $save ['tradedate']; $data['pay_type'] = "微信"; } else { $data['status'] = 0; $data['msg'] = '付款成功,更新订单失败,请联系管理员1'; } } else if (!empty($result) && $result['err_code'] == 'USERPAYING' && $result["return_code"] == "SUCCESS" && $result["return_msg"] == "OK") {//用户支付中 $this->getMicroPayState($orderid, $storeid, $adminid, $merchantid, $orderInfo); } else if (!empty($result)) { $data['status'] = 0; $data['msg'] = $result['return_msg']; } else { $data['status'] = 0; $data['msg'] = "收款失败,请重试"; } $this->ajaxReturn($data); } //反复请求用户长时间才输入密码的支付状态 protected function getMicroPayState($orderid, $storeid, $adminid, $merchantid, $orderInfo) { $PayOrderModel = D('PayOrder'); $map['id'] = $orderid; $Order = $PayOrderModel->getFind($map); $res = $this->searchWxOrder($Order['storeid'], $Order['out_trade_no']); if ($res['trade_state'] == "USERPAYING" || $res['trade_code'] == "USERPAYING") { //用户支付中 $time = get_runtime(); if ($time < 20) { $this->getMicroPayState($orderid, $storeid, $adminid, $merchantid, $orderInfo); } else { //撤销订单 $this->canselOrder($Order['storeid'],$Order); } } else if ($res['trade_state'] == "SUCCESS" || $res['trade_code'] == "SUCCESS") {//支付成功修改订单 $save ['trade_no'] = $res ['transaction_id']; $save ['order_state'] = 'SUCCESS'; $time = substr($res['time_end'], 0, strlen($res['time_end']) - 10) . '-' . substr($res['time_end'], -10, 2) . '-' . substr($res['time_end'], -8, 2) . ' ' . substr($res['time_end'], -6, 2) . ':' . substr($res['time_end'], -4, 2) . ':' . substr($res['time_end'], -2, 2); $save ['tradedate'] = strtotime($time); $save ['mdate'] = time(); $save ['extend_content'] = json_encode($res); $update = $PayOrderModel->updateOrder($map, $save);//更新订单信息 if ($update) { if (isset($res['sub_appid'])) { A('Api/Vip')->toMark($res['sub_openid'], $orderid, $Order['trade_amount']); } else { A('Api/Vip')->toMark($res['openid'], $orderid, $Order['trade_amount']); } file_put_contents('./orderid2.txt', $orderid); A("Sellapi/PayRefund")->payOvers(3, $adminid, $storeid, $merchantid, $orderInfo, $orderid); $data['status'] = 1; $data['msg'] = '收款成功'; $data['out_trade_no'] = $Order ['out_trade_no']; $data['mdate'] = $save ['tradedate']; $data['pay_type'] = "微信"; $this->ajaxReturn($data); } else { $data['status'] = 0; $data['msg'] = '付款成功,更新订单失败,请联系管理员2'; $this->ajaxReturn($data); } } else { $save ['order_state'] = 'REVOKED'; $save ['mdate'] = time(); $update = $PayOrderModel->updateOrder($map, $save);//更新订单信息 $data['status'] = 0; $data['msg'] = '用户取消支付'; $data['res'] = $res; $this->ajaxReturn($data); } } // 查询订单信息 protected function searchWxOrder($storeid, $out_trade_no) { file_put_contents('wx_searchWxOrder.txt','out_trade_no: '.$out_trade_no."\r\n",FILE_APPEND); $config = D('Payset')->getFindConfig($storeid);//获取商户微信配置信息 $order = M('retail_pay_order')->where(array('out_trade_no' => $out_trade_no, 'storeid' => $storeid))->find(); if ($order["m_pay_type"] == 1) { $key = $config['wx_secret_key']; $obj['appid'] = $config['wx_appid']; $obj['mch_id'] = $config['wx_mch_id']; } else if ($order["m_pay_type"] == 2) { $partnerid = M("retail_merchant")->where(array("id" => $config["merchantid"]))->getField("partnerid"); $cache = M("systemconfig")->where(array("partnerid" => $partnerid))->find(); $key = $cache['wx_key']; $obj['appid'] = $cache['wx_appid']; $obj['mch_id'] = $cache['mch_id']; if(!empty($config['wx_sub_appid'])){ $obj['sub_appid'] = $config['wx_sub_appid']; } $obj['sub_mch_id'] = $config['wx_sub_mchid']; } $WxMicroPay = new \Util\Wx\WxMicroPay(array('key' => $key)); $obj['out_trade_no'] = $out_trade_no; $obj['nonce_str'] = $WxMicroPay->createNoncestr(32); $obj['sign'] = $WxMicroPay->getSign($obj); file_put_contents('./okok.txt', '2: ' . json_encode($obj) . "\r\n", FILE_APPEND); $url = 'https://api.mch.weixin.qq.com/pay/orderquery'; $xml = $WxMicroPay->arrayToXml($obj);//转换为xml $response = $WxMicroPay->postXmlCurl($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); file_put_contents("./2.txt", '3: '.json_encode($response) . "\r\n", FILE_APPEND); file_put_contents("./2.txt", json_encode($obj) . "\r\n", FILE_APPEND); $response['obj'] = $obj; return $response; } // 撤销订单 protected function canselOrder($storeid, $Order) { $config = D('Payset')->getFindConfig($storeid); if ($Order["m_pay_type"] == 1) { $post['appid'] = $config['wx_appid']; $post['mch_id'] = $config['wx_mch_id']; $arr['apiclient_cert'] = $config['apiclient_cert']; $arr['apiclient_key'] = $config['apiclient_key']; $arr['key'] = $config['wx_secret_key']; } else if ($config["m_pay_type"] == 2) { //查询合作伙伴配置 $id = $config["merchantid"]; $partnerid = M("retail_merchant")->where(array("id" => $id))->getField("partnerid"); $cache = M("systemconfig")->where(array("partnerid" => $partnerid))->find(); $post['appid'] = $cache['wx_appid']; $post['mch_id'] = $cache['mch_id']; if(!empty($config['wx_sub_appid'])){ $post['sub_appid'] = $config['wx_sub_appid']; } $post['sub_mch_id'] = $config['wx_sub_mchid']; $arr['apiclient_cert'] = $cache['wx_apiclient_cert']; $arr['apiclient_key'] = $cache['wx_apiclient_key']; $arr['key'] = $cache['wx_key']; } else { $data['status'] = 0; $data['msg'] = '商户支付模式有误'; $this->ajaxReturn($data); } $WxMicroPay = new \Util\Wx\WxMicroPay($arr); $post['out_trade_no'] = $Order['out_trade_no']; $post['nonce_str'] = $WxMicroPay->createNoncestr(32); $post['sign'] = $WxMicroPay->getSign($post); $url = 'https://api.mch.weixin.qq.com/secapi/pay/reverse'; $xml = $WxMicroPay->arrayToXml($post); $response = $WxMicroPay->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); if($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS'){ $res = $this->searchWxOrder($storeid, $Order['out_trade_no']); if($res['trade_state'] == "REVOKED" || $res['trade_code'] == "CLOSED"){ $save ['order_state'] = 'REVOKED'; $PayOrderModel = D('PayOrder'); $res = $PayOrderModel->updateOrder(array('out_trade_no' => $Order['out_trade_no']), $save);//更新订单信息 $data['status'] = 1; $data['msg'] = '订单超时,并已撤销'; }else{ $time = get_runtime(); if ($time < 10) { $this->canselOrder($storeid, $Order); }else{ $data['responseS'] = $res; $data['status'] = 0; $data['msg'] = '订单超时,但撤销失败,请用户别支付'; } } }else{ $data['status'] = 0; $data['msg'] = '订单超时,但撤销失败'; } $this->ajaxReturn($data); } /* * 10-30 之前的退款 * * */ // 直连退款接口 public function refund($storeid, $trade_no, $itemAll) { $PayOrder = D('PayOrder'); $map['trade_no'] = $trade_no; $Order = $PayOrder->getFind($map); $config = D('Payset')->getFindConfig($storeid); //以下为往微信发送的数据 $item1['apiclient_cert'] = $config['apiclient_cert']; $item1['apiclient_key'] = $config['apiclient_key']; $item1['key'] = $config['wx_secret_key']; $WxMicroPay = new \Util\Wx\WxMicroPay($item1); $obj['appid'] = $config['wx_appid']; $obj['mch_id'] = $config['wx_mch_id']; $obj['nonce_str'] = $WxMicroPay->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $itemAll['out_refund_no']; $obj['total_fee'] = $Order['trade_amount'] * 100; $obj['refund_fee'] = $itemAll['refund_money'] * 100; $obj['sign'] = $WxMicroPay->getSign($obj); $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund'; $xml = $WxMicroPay->arrayToXml($obj);//转换为xml $response = $WxMicroPay->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { $this->searchRefund($Order['id'], $obj['out_refund_no'], $response['refund_id'], $itemAll); } else { $data['status'] = 0; $data['msg'] = $response; $this->ajaxReturn($data); } } /* * 10-30 之前的退款 查询 * */ // 退款查询 protected function searchRefund($orderid, $out_refund_no, $refund_id, $itemAll) { $PayOrder = D('PayOrder'); $Order = $PayOrder->getFind(array('id' => $orderid)); $config = D('Payset')->getFindConfig($Order['storeid']); $item1['apiclient_cert'] = $config['apiclient_cert']; $item1['apiclient_key'] = $config['apiclient_key']; $item1['key'] = $config['wx_secret_key']; $WxMicroPay = new \Util\Wx\WxMicroPay($item1); $obj['appid'] = $config['wx_appid']; $obj['mch_id'] = $config['wx_mch_id']; $obj['nonce_str'] = $WxMicroPay->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $out_refund_no; $obj['refund_id'] = $refund_id; $obj['sign'] = $WxMicroPay->getSign($obj); $url = 'https://api.mch.weixin.qq.com/pay/refundquery'; $xml = $WxMicroPay->arrayToXml($obj); $response = $WxMicroPay->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { switch ($response['refund_status_0']) { case 'PROCESSING': case 'SUCCESS': $PayOrder = D('PayOrder'); $save['goods_info'] = json_encode($itemAll['original_order']); $res = $PayOrder->updateOrder(array('trade_no' => $Order['trade_no']), $save); if ($res) { $time = time(); $item['pid'] = $Order['id']; $item['order_type'] = 3; $item['pay_type'] = $Order['pay_type']; $item['trade_amount'] = $itemAll['refund_money']; $item['storeid'] = $Order['storeid']; $item['adminid'] = $itemAll['adminid']; $item['order_state'] = 'REFUND'; $item['cdate'] = $time; $item['extend_content'] = json_encode($response); $item['goods_info'] = json_encode($itemAll['refund_goods_info']); $item['remark'] = '退款成功'; $item['trade_no'] = $response['refund_id_0']; $item['out_trade_no'] = $itemAll['out_refund_no']; $addRefund = $PayOrder->addOrder($item); A('Sellapi/Order')->refund(json_encode($itemAll['refund_goods_info']), $Order['storeid'], $Order['id'], $itemAll['adminid'], $Order['pay_type'] == 1 ? 3 : 4, $Order['id']); if ($addRefund) { $data['status'] = 1; $data['msg'] = "退款成功"; } else { $data['status'] = 0; $data['msg'] = "已提交退款申请
更新订单失败"; } } else { $data['status'] = 0; $data['msg'] = "已提交退款申请
更新订单失败"; } $this->ajaxReturn($data); break; case 'REFUNDCLOSE': //退款关闭 $data['status'] = 0; $data['msg'] = '退款关闭'; $this->ajaxReturn($data); break; case 'CHANGE': //退款异常-退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台(pay.weixin.qq.com)-交易中心,手动处理此笔退款。 $data['status'] = 0; $data['msg'] = '退款异常,商户银行卡异常'; $this->ajaxReturn($data); } } else { $this->searchRefund($Order, $out_refund_no, $refund_id, $itemAll); } } /* * 10-30退款 * */ // 退款接口 public function oemrefund($storeid, $trade_no, $itemAll) { $config = D('Payset')->getFindConfig($storeid);//获取商户微信配置信息 if (empty($config)) { $data['status'] = 0; $data['msg'] = '商家支付参数未配置'; $this->ajaxReturn($data); } if ($config["status"] == 1) { // 普通模式退款 商家自己配置的支付 $this->ptrefund($storeid, $trade_no, $itemAll); } else if ($config["status"] == 3) { //查询合作伙伴配置 服务商模式支付退款 $this->fwsrefund($storeid, $trade_no, $itemAll); // file_put_contents("wxpay.txt",json_encode($post)); } else if ($config["status"] == 4) { //新大陆支付退款 A('Pay/PayContinent')->BarcodePay($trade_no, $config['merchantid'], 2, $itemAll); } } /* * 10-30 * */ // 普通模式退款 商家自己配置的支付直连退款接口 public function ptrefund($storeid, $trade_no, $itemAll) { $PayOrder = D('PayOrder'); $map['trade_no'] = $trade_no; $Order = $PayOrder->getFind($map); $config = D('Payset')->getFindConfig($storeid); //以下为往微信发送的数据 $item1['apiclient_cert'] = $config['apiclient_cert']; $item1['apiclient_key'] = $config['apiclient_key']; $item1['key'] = $config['wx_secret_key']; $WxMicroPay = new \Util\Wx\WxMicroPay($item1); $obj['appid'] = $config['wx_appid']; $obj['mch_id'] = $config['wx_mch_id']; $obj['nonce_str'] = $WxMicroPay->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $itemAll['out_refund_no']; $obj['total_fee'] = $Order['trade_amount'] * 100; $obj['refund_fee'] = $itemAll['refund_money'] * 100; $obj['sign'] = $WxMicroPay->getSign($obj); $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund'; $xml = $WxMicroPay->arrayToXml($obj);//转换为xml $response = $WxMicroPay->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { $this->ptsearchRefund($Order['id'], $obj['out_refund_no'], $response['refund_id'], $itemAll, $config, $Order); } else { $data['status'] = 0; $data['msg'] = $response; $this->ajaxReturn($data); } } /* * 10 - 30 * 普通模式退款 商家自己配置的支付直连退款接口退款查询 * */ protected function ptsearchRefund($orderid, $out_refund_no, $refund_id, $itemAll, $config, $Order) { $item1['apiclient_cert'] = $config['apiclient_cert']; $item1['apiclient_key'] = $config['apiclient_key']; $item1['key'] = $config['wx_secret_key']; $WxMicroPay = new \Util\Wx\WxMicroPay($item1); $obj['appid'] = $config['wx_appid']; $obj['mch_id'] = $config['wx_mch_id']; $obj['nonce_str'] = $WxMicroPay->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $out_refund_no; $obj['refund_id'] = $refund_id; $obj['sign'] = $WxMicroPay->getSign($obj); $url = 'https://api.mch.weixin.qq.com/pay/refundquery'; $xml = $WxMicroPay->arrayToXml($obj); $response = $WxMicroPay->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { switch ($response['refund_status_0']) { case 'PROCESSING': case 'SUCCESS': $PayOrder = D('PayOrder'); $save['goods_info'] = json_encode($itemAll['original_order']); $res = $PayOrder->updateOrder(array('trade_no' => $Order['trade_no']), $save); if ($res) { $time = time(); $item['pid'] = $Order['id']; $item['order_type'] = 3; $item['pay_type'] = $Order['pay_type']; $item['trade_amount'] = $itemAll['refund_money']; $item['storeid'] = $Order['storeid']; $item['adminid'] = $itemAll['adminid']; $item['order_state'] = 'REFUND'; $item['cdate'] = $time; $item['extend_content'] = json_encode($response); $item['goods_info'] = json_encode($itemAll['refund_goods_info']); $item['remark'] = '退款成功'; $item['trade_no'] = $response['refund_id_0']; $item['out_trade_no'] = $itemAll['out_refund_no']; $addRefund = $PayOrder->addOrder($item); $merchantid = M('retail_store')->where(array('id' => $Order['storeid']))->getField('merchantid'); // 退货商品 // A('Sellapi/Order')->refund(json_encode($itemAll['refund_goods_info']),$Order['storeid'],$Order['id'],$itemAll['adminid'],$Order['pay_type']==1?3:4,$Order['id']); $res = A('Sellapi/Refund')->hasOrderRefund($itemAll['adminid'], $itemAll['refund_goods_info'], $Order['storeid'], $merchantid, $itemAll['oldorderid'], $addRefund); if ($res['status'] == 0) { $data['msg2'] = $res['msg']; } if ($addRefund) { $data['status'] = 1; $data['msg'] = "退款成功"; } else { $data['status'] = 0; $data['msg'] = "已提交退款申请
更新订单失败"; } } else { $data['status'] = 0; $data['msg'] = "已提交退款申请
更新订单失败"; } $this->ajaxReturn($data); break; case 'REFUNDCLOSE': //退款关闭 $data['status'] = 0; $data['msg'] = '退款关闭'; $this->ajaxReturn($data); break; case 'CHANGE': //退款异常-退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台(pay.weixin.qq.com)-交易中心,手动处理此笔退款。 $data['status'] = 0; $data['msg'] = '退款异常,商户银行卡异常'; $this->ajaxReturn($data); } } else { $this->ptsearchRefund($Order, $out_refund_no, $refund_id, $itemAll, $config, $Order); } } /* * 10-30 * 服务商模式退款 * */ // 直连退款接口 public function fwsrefund($storeid, $trade_no, $itemAll) { $PayOrder = D('PayOrder'); $map['trade_no'] = $trade_no; $Order = $PayOrder->getFind($map); $config = D('Payset')->getFindConfig($storeid); $id = $config["merchantid"]; $partnerid = M("retail_merchant")->where(array("id" => $id))->getField("partnerid"); $cache = M("systemconfig")->where(array("partnerid" => $partnerid))->find(); $obj['appid'] = $cache['wx_appid']; $obj['mch_id'] = $cache['mch_id']; $obj['sub_appid'] = $config['wx_appid']; $obj['sub_mch_id'] = $config['wx_sub_mchid']; //print_r($dcping_api); //以下为往微信发送的数据 $WxPaysdk = new \Util\Wx\Wxpaysdk(array('key' => $cache['wx_key'])); $obj['nonce_str'] = $WxPaysdk->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $itemAll['out_refund_no']; $obj['total_fee'] = $Order['trade_amount'] * 100; $obj['refund_fee'] = $itemAll['refund_money'] * 100; $obj['sign'] = $WxPaysdk->getSign($obj); $arr['apiclient_cert'] = $cache['wx_apiclient_cert']; $arr['apiclient_key'] = $cache['wx_apiclient_key']; //trade_state $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund'; $xml = $WxPaysdk->arrayToXml($obj);//转换为xml file_put_contents('./wxrefunddata.txt', 1); $postWx = new \Util\Wx\WxMicroPay($arr); $response = $postWx->postXmlCurlCancel($xml, $url, 30); // var_dump($postWx); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); file_put_contents('./wxrefundreturn.txt', json_encode($response) . "\r\n", FILE_APPEND); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { $this->fwssearchRefund($Order['id'], $obj['out_refund_no'], $response['refund_id'], $itemAll, $config, $Order, $cache); } else { $data['status'] = 0; $data['msg'] = $response['err_code_des'] ? $response['err_code_des'] : $response['return_msg'] ? $response['return_msg'] : '退款失败'; } $this->ajaxReturn($data); } /* * 服务商模式退款查询 * */ // 退款查询 public function fwssearchRefund($orderid, $out_refund_no, $refund_id, $itemAll, $config, $Order, $cache) { $obj['appid'] = $cache['wx_appid']; $obj['mch_id'] = $cache['mch_id']; $obj['sub_appid'] = $config['wx_appid']; $obj['sub_mch_id'] = $config['wx_sub_mchid']; //以下为往微信发送的数据 $WxPaysdk = new \Util\Wx\Wxpaysdk(array('key' => $cache['wx_key'])); $obj['nonce_str'] = $WxPaysdk->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $itemAll['out_refund_no']; //以下为往微信发送的数据 $obj['refund_id'] = $refund_id; $obj['sign'] = $WxPaysdk->getSign($obj); $url = 'https://api.mch.weixin.qq.com/pay/refundquery'; $xml = $WxPaysdk->arrayToXml($obj);//转换为xml $arr['apiclient_cert'] = $cache['wx_apiclient_cert']; $arr['apiclient_key'] = $cache['wx_apiclient_key']; $postWx = new \Util\Wx\WxMicroPay($arr); $response = $postWx->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); file_put_contents('./wxrefund.txt', json_encode($response)); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { switch ($response['refund_status_0']) { case 'PROCESSING': case 'SUCCESS': $PayOrder = D('PayOrder'); $time = time(); $item['pid'] = $Order['id']; $item['order_type'] = 3; $item['pay_type'] = $Order['pay_type']; $item['trade_amount'] = $itemAll['refund_money']; $item['storeid'] = $Order['storeid']; $item['adminid'] = $itemAll['adminid']; $item['order_state'] = 'REFUND'; $item['cdate'] = $time; $item['extend_content'] = json_encode($response); $item['goods_info'] = json_encode($itemAll['refund_goods_info']); $item['remark'] = '退款成功'; $item['trade_no'] = $response['refund_id_0']; $item['out_trade_no'] = $itemAll['out_refund_no']; $addRefund = $PayOrder->addOrder($item); $merchantid = M('retail_store')->where(array('id' => $Order['storeid']))->getField('merchantid'); // 退货商品 $res2 = A('Sellapi/Refund')->hasOrderRefund($itemAll['adminid'], $itemAll['refund_goods_info'], $Order['storeid'], $merchantid, $itemAll['oldorderid'], $addRefund); if ($res2['status'] == 0) { $data['msg2'] = $res2['msg']; } if ($addRefund) { $data['status'] = 1; $data['msg'] = "退款成功"; } else { $data['status'] = 0; $data['msg'] = "已提交退款申请
更新订单失败"; } $this->ajaxReturn($data); break; case 'REFUNDCLOSE': //退款关闭 $data['status'] = 0; $data['msg'] = '退款关闭'; $this->ajaxReturn($data); break; case 'CHANGE': //退款异常-退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台(pay.weixin.qq.com)-交易中心,手动处理此笔退款。 $data['status'] = 0; $data['msg'] = '退款异常,商户银行卡异常'; $this->ajaxReturn($data); } } else { $data['status'] = 0; $data['msg'] = '退款失败'; $this->ajaxReturn($data); } } //10-31 修改支付流程 PS:下方orderid 为retail_pay_order支付表id 并非后台用户商品订单需要的id public function toWxPaybackups($pay_order, $bill_id, $config) { if ($pay_order["m_pay_type"] == 1) { $post['appid'] = $config['wx_appid']; $post['mch_id'] = $config['wx_mch_id']; $post['body'] = $config['name'] . '-' . $config['storetag']; $post['out_trade_no'] = $pay_order['out_trade_no']; $post['total_fee'] = $pay_order['trade_amount']; $post['auth_code'] = $pay_order['code']; $post['key'] = $config['wx_secret_key']; } else if ($pay_order["m_pay_type"] == 2) { //查询合作伙伴配置 $id = $config["merchantid"]; $partnerid = M("retail_merchant")->where(array("id" => $id))->getField("partnerid"); $cache = M("systemconfig")->where(array("partnerid" => $partnerid))->find(); $post['appid'] = $cache['wx_appid']; $post['mch_id'] = $cache['mch_id']; $post['body'] = $config['name'] . '-' . $config['storetag']; $post['out_trade_no'] = $pay_order['out_trade_no']; $post['total_fee'] = $pay_order['trade_amount']; $post['auth_code'] = $pay_order['code']; $post['key'] = $cache['wx_key']; $post['sub_mch_id'] = $config["wx_sub_mchid"]; if(!empty($config['wx_sub_appid'])){ $post['sub_appid'] = $config['wx_sub_appid']; } } else if ($pay_order["m_pay_type"] == 3) { //新大陆支付 $continent['tradeNo'] = $pay_order['out_trade_no']; $continent['authCode'] = $pay_order['code']; $continent['types'] = 2; $continent['subject'] = '测试'; $continent['amount'] = $pay_order['trade_amount']; $continent['total_amount'] = $pay_order['trade_amount']; A('Pay/PayContinent')->pay($continent, $pay_order, $bill_id); exit; } //调起支付 $WxPaysdk = new \Util\Wx\WxMicroPay($post); $result = $WxPaysdk->postWxMicro(); file_put_contents('./okok.txt', '1: ' . json_encode($post) . "\r\n", FILE_APPEND); file_put_contents('./okok.txt', '2: ' . json_encode($result) . "\r\n", FILE_APPEND); if (!empty($result) && $result['result_code'] == 'SUCCESS' && $result['return_code'] == 'SUCCESS') { //修改订单状态 $save ['trade_no'] = $result ['transaction_id']; $save ['order_state'] = 'SUCCESS'; $time = substr($result['time_end'], 0, strlen($result['time_end']) - 10) . '-' . substr($result['time_end'], -10, 2) . '-' . substr($result['time_end'], -8, 2) . ' ' . substr($result['time_end'], -6, 2) . ':' . substr($result['time_end'], -4, 2) . ':' . substr($result['time_end'], -2, 2); $save ['tradedate'] = strtotime($time); $save ['extend_content'] = json_encode($result); $PayOrderModel = D('PayOrder'); $update = $PayOrderModel->updateOrder(array('id' => $pay_order['id']), $save);//更新订单信息 if ($update) { if ($config["status"] == 3) { A('Api/Vip')->toMark($result['sub_openid'], $pay_order['id'], $pay_order['trade_amount']); } else { A('Api/Vip')->toMark($result['openid'], $pay_order['id'], $pay_order['trade_amount']); } file_put_contents('./orderid.txt', $pay_order['id']); $data['status'] = 1; $data['msg'] = '支付成功'; $data['out_trade_no'] = $pay_order['out_trade_no']; $data['mdate'] = $save ['tradedate']; $data['pay_type'] = "微信"; //打印机 A('Sellapi/Pay')->wxChange($bill_id, 3); } else { $data['status'] = 0; $data['msg'] = '付款成功,更新订单失败,请联系管理员1'; } } else if (!empty($result) && $result['err_code'] == 'USERPAYING' && $result["return_code"] == "SUCCESS" && $result["return_msg"] == "OK") {//用户支付中 $this->getMicroPayStatebackups($pay_order, $bill_id); } else if (!empty($result)) { $data['status'] = 0; $data['msg'] = '收款失败'; $data['data'] = $result; $this->ajaxReturn($data); } else { $data['status'] = 0; $data['data'] = $result; $data['msg'] = "收款失败,请重试"; $this->ajaxReturn($data); } } //2019-3-4加盟店店铺余额 //10-31 修改支付流程 PS:下方orderid 为retail_pay_order支付表id 并非后台用户商品订单需要的id public function toWxPaybackups_v1($pay_order, $bill_id, $config) { if ($pay_order["m_pay_type"] == 1) { $post['appid'] = $config['wx_appid']; $post['mch_id'] = $config['wx_mch_id']; $post['body'] = $config['name'] . '-' . $config['storetag']; $post['out_trade_no'] = $pay_order['out_trade_no']; $post['total_fee'] = $pay_order['trade_amount']; $post['auth_code'] = $pay_order['code']; $post['key'] = $config['wx_secret_key']; } else if ($pay_order["m_pay_type"] == 2) { //查询合作伙伴配置 $id = $config["merchantid"]; $partnerid = M("retail_merchant")->where(array("id" => $id))->getField("partnerid"); $cache = M("systemconfig")->where(array("partnerid" => $partnerid))->find(); $post['appid'] = $cache['wx_appid']; $post['mch_id'] = $cache['mch_id']; $post['body'] = $config['name'] . '-' . $config['storetag']; $post['out_trade_no'] = $pay_order['out_trade_no']; $post['total_fee'] = $pay_order['trade_amount']; $post['auth_code'] = $pay_order['code']; $post['key'] = $cache['wx_key']; $post['sub_mch_id'] = $config["wx_sub_mchid"]; $post['sub_appid'] = $config['wx_appid']; } else if ($pay_order["m_pay_type"] == 3) { //新大陆支付 $continent['tradeNo'] = $pay_order['out_trade_no']; $continent['authCode'] = $pay_order['code']; $continent['types'] = 2; $continent['subject'] = '测试'; $continent['amount'] = $pay_order['trade_amount']; $continent['total_amount'] = $pay_order['trade_amount']; A('Pay/PayContinent')->pay($continent, $pay_order, $bill_id); exit; } //调起支付 $WxPaysdk = new \Util\Wx\WxMicroPay($post); $result = $WxPaysdk->postWxMicro(); file_put_contents('./okok.txt', '1: ' . json_encode($post) . "\r\n", FILE_APPEND); file_put_contents('./okok.txt', '2: ' . json_encode($result) . "\r\n", FILE_APPEND); if (!empty($result) && $result['result_code'] == 'SUCCESS' && $result['return_code'] == 'SUCCESS') { //修改订单状态 $save ['trade_no'] = $result ['transaction_id']; $save ['order_state'] = 'SUCCESS'; $time = substr($result['time_end'], 0, strlen($result['time_end']) - 10) . '-' . substr($result['time_end'], -10, 2) . '-' . substr($result['time_end'], -8, 2) . ' ' . substr($result['time_end'], -6, 2) . ':' . substr($result['time_end'], -4, 2) . ':' . substr($result['time_end'], -2, 2); $save ['tradedate'] = strtotime($time); $save ['extend_content'] = json_encode($result); $PayOrderModel = D('PayOrder'); $update = $PayOrderModel->updateOrder(array('id' => $pay_order['id']), $save);//更新订单信息 if ($update) { if ($config["status"] == 3) { A('Api/Vip')->toMark($result['sub_openid'], $pay_order['id'], $pay_order['trade_amount']); } else { A('Api/Vip')->toMark($result['openid'], $pay_order['id'], $pay_order['trade_amount']); } file_put_contents('./orderid.txt', $pay_order['id']); $data['status'] = 1; $data['msg'] = '支付成功'; $data['out_trade_no'] = $pay_order['out_trade_no']; $data['mdate'] = $save ['tradedate']; $data['pay_type'] = "微信"; //打印机 A('Sellapi/Pay')->wxChange_v1($bill_id, 3); } else { $data['status'] = 0; $data['msg'] = '付款成功,更新订单失败,请联系管理员1'; } } else if (!empty($result) && $result['err_code'] == 'USERPAYING' && $result["return_code"] == "SUCCESS" && $result["return_msg"] == "OK") {//用户支付中 $this->getMicroPayStatebackups($pay_order, $bill_id); } else if (!empty($result)) { $data['status'] = 0; $data['msg'] = '收款失败'; $data['data'] = $result; $this->ajaxReturn($data); } else { $data['status'] = 0; $data['data'] = $result; $data['msg'] = "收款失败,请重试"; $this->ajaxReturn($data); } } //反复请求用户长时间才输入密码的支付状态 PS:下方orderid 为retail_pay_order支付表id 并非后台用户商品订单需要的id protected function getMicroPayStatebackups($Order, $bill_id) { $PayOrderModel = D('PayOrder'); $map['id'] = $Order['id']; $res = $this->searchWxOrder($Order['storeid'], $Order['out_trade_no']); $data['data'] = $res; if ($res['trade_state'] == "USERPAYING" || $res['trade_code'] == "USERPAYING") { //用户支付中 $time = get_runtime(); if ($time < 20) { $this->getMicroPayStatebackups($Order, $bill_id); } else { //撤销订单 $this->canselOrder($Order['storeid'],$Order); } } else if ($res['trade_state'] == "SUCCESS" || $res['trade_code'] == "SUCCESS") {//支付成功修改订单 $save ['trade_no'] = $res ['transaction_id']; $save ['order_state'] = 'SUCCESS'; $time = substr($res['time_end'], 0, strlen($res['time_end']) - 10) . '-' . substr($res['time_end'], -10, 2) . '-' . substr($res['time_end'], -8, 2) . ' ' . substr($res['time_end'], -6, 2) . ':' . substr($res['time_end'], -4, 2) . ':' . substr($res['time_end'], -2, 2); $save ['tradedate'] = strtotime($time); $save ['mdate'] = time(); $save ['extend_content'] = json_encode($res); $update = $PayOrderModel->updateOrder($map, $save);//更新订单信息 if ($update) { if (isset($res['sub_appid'])) { A('Api/Vip')->toMark($res['sub_openid'], $Order['id'], $Order['trade_amount']); } else { A('Api/Vip')->toMark($res['openid'], $Order['id'], $Order['trade_amount']); } // file_put_contents('./orderid2.txt', $Order['id']); //支付成功 A('Sellapi/Pay')->wxChange($bill_id, 3); } else { A('Sellapi/Pay')->wxChange($bill_id, 3); $data['status'] = 0; $data['msg'] = '付款成功,更新订单失败,请联系管理员2'; } } else { $save ['order_state'] = 'REVOKED'; $save ['mdate'] = time(); $update = $PayOrderModel->updateOrder($map, $save);//更新订单信息 $data['status'] = 0; $data['msg'] = '用户取消支付'; $data['res'] = $res; $this->ajaxReturn($data); } } /* * 2018-11-16 退款 * */ public function newRefund_v1($trade_no, $itemAll, $pay_order) { if ($pay_order['m_pay_type'] == 1) { $res = $this->ptRefund_v1($itemAll, $pay_order); // 普通模式退款 商家自己配置的支付 } else if ($pay_order['m_pay_type'] == 2) { $res = $this->fwsRefund_v1($trade_no, $itemAll); //查询合作伙伴配置 服务商模式支付退款 } else if ($pay_order['m_pay_type'] == 3) { $res = A('Pay/PayContinent')->newRefund_v1($trade_no, $itemAll['merchantid'], $itemAll);//新大陆支付退款 } else { $res['status'] = 0; $res['msg'] = '订单信息有误'; } return $res; } /* * 2018-11-16 * 普通模式退款 商家自己配置的支付直连退款接口 * */ public function ptRefund_v1($itemAll, $Order) { $config = D('Payset')->getFindConfig($itemAll['storeid']); //以下为往微信发送的数据 $item1['apiclient_cert'] = $config['apiclient_cert']; $item1['apiclient_key'] = $config['apiclient_key']; $item1['key'] = $config['wx_secret_key']; $WxMicroPay = new \Util\Wx\WxMicroPay($item1); $obj['appid'] = $config['wx_appid']; $obj['mch_id'] = $config['wx_mch_id']; $obj['nonce_str'] = $WxMicroPay->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $itemAll['out_refund_no']; $obj['total_fee'] = $Order['trade_amount'] * 100; $obj['refund_fee'] = $itemAll['refund_money'] * 100; $obj['sign'] = $WxMicroPay->getSign($obj); $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund'; $xml = $WxMicroPay->arrayToXml($obj);//转换为xml $response = $WxMicroPay->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); file_put_contents('./wx_refund1.txt', json_encode($response) . "\r\n", FILE_APPEND); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { $res = $this->ptSearchRefund_v1($response['refund_id'], $itemAll, $config, $Order); } else { $res['status'] = 0; $res['data'] = $response; $res['msg'] = '退款失败,请商家检查微信可用余额'; } return $res; } /* * 2018-11-16 * 普通模式退款查询 商家自己配置的支付直连退款接口退款查询 * */ protected function ptSearchRefund_v1($refund_id, $itemAll, $config, $Order) { $item1['apiclient_cert'] = $config['apiclient_cert']; $item1['apiclient_key'] = $config['apiclient_key']; $item1['key'] = $config['wx_secret_key']; $WxMicroPay = new \Util\Wx\WxMicroPay($item1); $obj['appid'] = $config['wx_appid']; $obj['mch_id'] = $config['wx_mch_id']; $obj['nonce_str'] = $WxMicroPay->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $itemAll['out_refund_no']; $obj['refund_id'] = $refund_id; $obj['sign'] = $WxMicroPay->getSign($obj); $url = 'https://api.mch.weixin.qq.com/pay/refundquery'; $xml = $WxMicroPay->arrayToXml($obj); $response = $WxMicroPay->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { switch ($response['refund_status_0']) { case 'PROCESSING': case 'SUCCESS': $res['status'] = 1; $res['data'] = $response; $res['msg'] = '退款成功'; break; case 'REFUNDCLOSE': //退款关闭 $res['status'] = 0; $res['msg'] = '退款关闭'; break; case 'CHANGE': //退款异常-退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台(pay.weixin.qq.com)-交易中心,手动处理此笔退款。 $res['status'] = 0; $res['msg'] = '退款异常,商户银行卡异常'; } } else { $res['obj'] = $obj; $res['data'] = $response; $res['status'] = 0; $res['msg'] = '退款失败'; } return $res; } /* * 2018-11-16 * 服务商模式退款 * */ public function fwsRefund_v1($trade_no, $itemAll) { $PayOrder = D('PayOrder'); $map['trade_no'] = $trade_no; $Order = $PayOrder->getFind($map); $config = D('Payset')->getFindConfig($itemAll['storeid']); $id = $config["merchantid"]; $partnerid = M("retail_merchant")->where(array("id" => $id))->getField("partnerid"); $cache = M("systemconfig")->where(array("partnerid" => $partnerid))->find(); //以下为往微信发送的数据 $obj['appid'] = $cache['wx_appid']; $obj['mch_id'] = $cache['mch_id']; if(!empty($config['wx_sub_appid'])){ $obj['sub_appid'] = $config['wx_sub_appid']; } $obj['sub_mch_id'] = $config['wx_sub_mchid']; $WxPaysdk = new \Util\Wx\Wxpaysdk(array('key' => $cache['wx_key'])); $obj['nonce_str'] = $WxPaysdk->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $itemAll['out_refund_no']; $obj['total_fee'] = $Order['trade_amount'] * 100; $obj['refund_fee'] = $itemAll['refund_money'] * 100; $obj['sign'] = $WxPaysdk->getSign($obj); $arr['apiclient_cert'] = $cache['wx_apiclient_cert']; $arr['apiclient_key'] = $cache['wx_apiclient_key']; $arr['key'] = $cache['wx_key']; $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund'; $xml = $WxPaysdk->arrayToXml($obj); file_put_contents('./wxrefunddata.txt', 1); $postWx = new \Util\Wx\WxMicroPay($arr); $response = $postWx->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); file_put_contents('./wxrefundreturn.txt', json_encode($response) . "\r\n", FILE_APPEND); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { $res = $this->fwsSearchRefund_v1($response['refund_id'], $itemAll, $config, $Order, $cache); } else { $res['status'] = 0; $res['msg'] = $response['err_code_des'] ? $response['err_code_des'] : $response['return_msg'] ? $response['return_msg'] : '退款失败'; } return $res; } /* * 服务商模式退款查询 * */ public function fwsSearchRefund_v1($refund_id, $itemAll, $config, $Order, $cache) { //以下为往微信发送的数据 $WxPaysdk = new \Util\Wx\Wxpaysdk(array('key' => $cache['wx_key'])); $obj['appid'] = $cache['wx_appid']; $obj['mch_id'] = $cache['mch_id']; if(!empty($config['wx_sub_appid'])){ $obj['sub_appid'] = $config['wx_sub_appid']; } $obj['sub_mch_id'] = $config['wx_sub_mchid']; $obj['nonce_str'] = $WxPaysdk->createNoncestr(32); $obj['transaction_id'] = $Order['trade_no']; $obj['out_trade_no'] = $Order['out_trade_no']; $obj['out_refund_no'] = $itemAll['out_refund_no']; $obj['refund_id'] = $refund_id; $obj['sign'] = $WxPaysdk->getSign($obj); $url = 'https://api.mch.weixin.qq.com/pay/refundquery'; $xml = $WxPaysdk->arrayToXml($obj); $arr['apiclient_cert'] = $cache['wx_apiclient_cert']; $arr['apiclient_key'] = $cache['wx_apiclient_key']; $postWx = new \Util\Wx\WxMicroPay($arr); $response = $postWx->postXmlCurlCancel($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); file_put_contents('./wxrefund.txt', json_encode($response)); if ($response['result_code'] == 'SUCCESS' && $response['return_code'] == 'SUCCESS') { switch ($response['refund_status_0']) { case 'PROCESSING': case 'SUCCESS': $res['status'] = 1; $res['data'] = $response; $res['msg'] = '退款成功'; break; case 'REFUNDCLOSE': //退款关闭 $res['status'] = 0; $res['msg'] = '退款关闭'; break; case 'CHANGE': //退款异常-退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台(pay.weixin.qq.com)-交易中心,手动处理此笔退款。 $res['status'] = 0; $res['msg'] = '退款异常,商户银行卡异常'; } } else { $res['status'] = 0; $res['data'] = $response; $res['msg'] = '退款失败'; } return $res; } /* * 2018-11-28 会员充值 * */ public function toWxPayRecharge($order, $config) { if ($order["m_pay_type"] == 1) { $post['appid'] = $config['wx_appid']; $post['mch_id'] = $config['wx_mch_id']; $post['body'] = $config['name'] . '-' . $config['storetag']; $post['out_trade_no'] = $order['out_trade_no']; $post['total_fee'] = $order['trade_amount']; $post['auth_code'] = $order['code']; $post['key'] = $config['wx_secret_key']; } else if ($order["m_pay_type"] == 2) { //查询合作伙伴配置 $partnerid = M("retail_merchant")->where(array("id" => $config["merchantid"]))->getField("partnerid"); $cache = M("systemconfig")->where(array("partnerid" => $partnerid))->find(); $post['appid'] = $cache['wx_appid']; $post['mch_id'] = $cache['mch_id']; $post['body'] = $config['name'] . '-' . $config['storetag']; $post['out_trade_no'] = $order['out_trade_no']; $post['total_fee'] = $order['trade_amount']; $post['auth_code'] = $order['code']; $post['key'] = $cache['wx_key']; $post['sub_mch_id'] = $config["wx_sub_mchid"]; if(!empty($config['wx_sub_appid'])){ $post['sub_appid'] = $config['wx_sub_appid']; } // file_put_contents("wxpay.txt", json_encode($post)); } else if ($order["m_pay_type"] == 3) { //新大陆支付 $continent['tradeNo'] = $order['out_trade_no']; $continent['authCode'] = $order['code']; $continent['type'] = 2; $continent['subject'] = '测试'; $continent['amount'] = $order['trade_amount']; $continent['total_amount'] = $order['trade_amount']; A('Pay/PayContinent')->payRecharge($continent, $config["merchantid"], $order); } $WxPaysdk = new \Util\Wx\WxMicroPay($post); $result = $WxPaysdk->postWxMicro(); if (!empty($result) && $result['result_code'] == 'SUCCESS' && $result['return_code'] == 'SUCCESS') { // file_put_contents('./towxpay.txt', 'data: ' . json_encode($order) . "\r\n", FILE_APPEND); //写入文件 调试 //修改订单状态 $save ['trade_no'] = $result ['transaction_id']; $save ['order_state'] = 'SUCCESS'; $time = substr($result['time_end'], 0, strlen($result['time_end']) - 10) . '-' . substr($result['time_end'], -10, 2) . '-' . substr($result['time_end'], -8, 2) . ' ' . substr($result['time_end'], -6, 2) . ':' . substr($result['time_end'], -4, 2) . ':' . substr($result['time_end'], -2, 2); $save ['tradedate'] = strtotime($time); $save ['extend_content'] = json_encode($result); $PayOrderModel = D('PayOrder'); $this->vipRecharge($order, $config["merchantid"]); // 充值送次卡 A('Xcxapi/VipCard')->rechargeGiveCard($order['merchantid'],$order['vid'],$order['trade_amount'],2); $update = $PayOrderModel->updateOrder(array('id' => $order['id']), $save);//更新订单信息 if ($update) { $data['status'] = 1; $data['msg'] = '充值成功'; $data['order_id'] = $order['id']; } else { $data['status'] = 1; $data['msg'] = '充值成功,更新订单失败,请联系管理员1'; $data['order_id'] = $order['id']; } } else if (!empty($result) && $result['err_code'] == 'USERPAYING' && $result["return_code"] == "SUCCESS" && $result["return_msg"] == "OK") {//用户支付中 $this->getMicroPayStateRecharge($order, $config["merchantid"]); } else if (!empty($result)) { $data['status'] = 0; $data['post'] = $post; $data['msg'] = $result['return_msg']; } else { $data['status'] = 0; $data['msg'] = "收款失败,请重试"; } $this->ajaxReturn($data); } private function getMicroPayStateRecharge($Order, $merchantid) { $PayOrderModel = D('PayOrder'); // file_put_contents('wx_searchWxOrder.txt','order: '.json_encode($Order)."\r\n",FILE_APPEND); $res = $this->searchWxOrder($Order['storeid'], $Order['out_trade_no']); if ($res['trade_state'] == "USERPAYING" || $res['trade_code'] == "USERPAYING") { //用户支付中 $time = get_runtime(); if ($time < 20) { $this->getMicroPayStateRecharge($Order, $merchantid); } else { //撤销订单 $this->canselOrder($Order['storeid'],$Order); } } else if ($res['trade_state'] == "SUCCESS" || $res['trade_code'] == "SUCCESS") {//支付成功修改订单 $save ['trade_no'] = $res ['transaction_id']; $save ['order_state'] = 'SUCCESS'; $time = substr($res['time_end'], 0, strlen($res['time_end']) - 10) . '-' . substr($res['time_end'], -10, 2) . '-' . substr($res['time_end'], -8, 2) . ' ' . substr($res['time_end'], -6, 2) . ':' . substr($res['time_end'], -4, 2) . ':' . substr($res['time_end'], -2, 2); $save ['tradedate'] = strtotime($time); $save ['mdate'] = time(); $save ['extend_content'] = json_encode($res); $update = $PayOrderModel->updateOrder(array('id' => $Order['id']), $save);//更新订单信息 $this->vipRecharge($Order, $merchantid); if ($update) { $data['status'] = 1; $data['msg'] = '充值成功'; $data['order_id'] = $Order['id']; } else { $data['status'] = 1; $data['msg'] = '付款成功,更新订单失败,请联系管理员2'; $data['order_id'] = $Order['id']; } $this->ajaxReturn($data); } else { $save ['order_state'] = 'REVOKED'; $save ['mdate'] = time(); $update = $PayOrderModel->updateOrder(array('id' => $Order['id']), $save);//更新订单信息 $data['status'] = 0; $data['msg'] = '用户取消支付'; $data['res'] = $res; $this->ajaxReturn($data); } } }