提交 c1c4cf46 authored 作者: 游宗学's avatar 游宗学

no message

上级 4c110b33
<?php
namespace Common\Helper\Pay;
use Common\Helper\BaseHelper;
/**
* @name
* @author lcc
*
*/
class WeChatPayHelper extends BaseHelper{
/**
* @name 生成预支付订单
* @version 2017年4月18日
* @author lcc
* @param $data
* @return status
*/
public function unifiedorder($pay_bill_id){
if(!is_numeric($pay_bill_id) || empty($pay_bill_id)){
return array('status' => 0, 'message' => '账单ID错误', 'data' => $pay_bill_id);
}
//根据账单ID查询订单信息
$pay_bill_model = D('Pay\PayBill');
$where['pay_bill_id'] = $pay_bill_id;
$where['pay_status'] = $pay_bill_model::PAY_NOT;
$where['pay_channel'] = $pay_bill_model::CHANNEL_WX;
$field = "pay_bill_id,product_name,document_number,pay_money";
$result_bill = $this->helper('Pay\PayBill')->getOne($where,$field);
if($result_bill['status'] == 0 || $result_bill['data']['pay_bill_id'] == null){
return array('status' => 0, 'message' => '账单不存在', 'data' => $pay_bill_id);
}
//组装数据准备请求微信接口生成预支付订单
$body = C('WECHATPAY_CONFIG')['APPNAME']."-".$result_bill['data']['product_name'];
$postArr = array('appid'=>C('WECHATPAY_CONFIG')['APPID'],
'mch_id'=>C('WECHATPAY_CONFIG')['MCHID'],
'nonce_str'=>guid(32),
'body'=>$body,
'out_trade_no'=>$result_bill['data']['document_number'],
'total_fee'=>$result_bill['data']['pay_money'],
'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],
'notify_url'=>C('WECHATPAY_CONFIG')['NOTIFYURL'],
'trade_type'=>C('WECHATPAY_CONFIG')['TRADETYPE']);
//签名
$sign = $this->makeSign($postArr);
$postArr['sign'] = $sign;
//数组转为XML格式
$post_xml = $this->arrayToXml($postArr);
//发起预支付订单请求
$result = $this->postXmlCurl($post_xml,"https://api.mch.weixin.qq.com/pay/unifiedorder");
if($result == false || empty($result)){
return array('status' => 0, 'message' => '发起预支付请求失败', 'data' => $result);
}
//XML返回结果转为数组
$result_arr = $this->xmlToArray($result);
if($result_arr == false || $result_arr['return_code'] != 'SUCCESS' || $result_arr['result_code'] != 'SUCCESS'){
return array('status' => 0, 'message' => '预支付请求失败', 'data' => $result_arr);
}
//组装APP支付需要的参数
$data_app = array('appid'=>C('WECHATPAY_CONFIG')['APPID'],
'partnerid'=>C('WECHATPAY_CONFIG')['MCHID'],
'noncestr'=>guid(32),
'prepayid'=>$result_arr['prepay_id'],
'package'=>'Sign=WXPay',
'timestamp'=>(string)NOW_TIME);
//签名
$sign = $this->makeSign($data_app);
$data_app['sign'] = $sign;
return array('status' => 1, 'message' => '成功', 'data' => $data_app);
}
/**
* @name 查询订单
* @version 2017年4月18日
* @author lcc
* @param $data
* @return status
*/
public function checkOrderHelper($document_number){
if (empty($document_number)) {
return array('status' => 0, 'message' => '订单号错误', 'data' => []);
}
$postArr = array('appid'=>C('WECHATPAY_CONFIG')['APPID'],
'mch_id'=>C('WECHATPAY_CONFIG')['MCHID'],
'nonce_str'=>guid(32),
'out_trade_no'=>$document_number);
//签名
$sign = $this->makeSign($postArr);
$postArr['sign'] = $sign;
//数组转为XML格式
$post_xml = $this->arrayToXml($postArr);
//发起预支付订单请求
$result = $this->postXmlCurl($post_xml,"https://api.mch.weixin.qq.com/pay/orderquery");
if($result == false || empty($result)){
return array('status' => 0, 'message' => '发起查询订单请求失败', 'data' => $result);
}
//XML返回结果转为数组
$result_arr = $this->xmlToArray($result);
if($result_arr == false || $result_arr['return_code'] != 'SUCCESS' || $result_arr['result_code'] != 'SUCCESS'){
return array('status' => 0, 'message' => '查询请求失败', 'data' => $result_arr);
}
return array('status' => 1, 'message' => '查询成功', 'data' => $result_arr);
}
/**
* @name 取消交易--APP支付
* @author lcc
*
*/
public function cancelThirdPayHelper($document_number){
if (empty($document_number)) {
return array('status' => 0, 'message' => '订单号错误', 'data' => []);
}
$postArr = array('appid'=>C('WECHATPAY_CONFIG')['APPID'],
'mch_id'=>C('WECHATPAY_CONFIG')['MCHID'],
'nonce_str'=>guid(32),
'out_trade_no'=>$document_number);
//签名
$sign = $this->makeSign($postArr);
$postArr['sign'] = $sign;
//数组转为XML格式
$post_xml = $this->arrayToXml($postArr);
//发起预支付订单请求
$result = $this->postXmlCurl($post_xml,"https://api.mch.weixin.qq.com/pay/closeorder");
if($result == false || empty($result)){
return array('status' => 0, 'message' => '发起查询订单请求失败', 'data' => $result);
}
//XML返回结果转为数组
$result_arr = $this->xmlToArray($result);
if($result_arr == false || $result_arr['return_code'] != 'SUCCESS'){
return array('status' => 0, 'message' => '查询请求失败', 'data' => $result_arr);
}
if($result_arr['err_code'] != '' && $result_arr['err_code'] != 'ORDERCLOSED'){
return array('status' => 0, 'message' => '关闭订单失败,'.$result_arr['err_code_des'], 'data' => $result_arr);
}
return array('status' => 1, 'message' => '成功', 'data' => $result_arr);
}
/**
* 生成签名
* @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值
*/
public function makeSign($arr)
{
//签名步骤一:按字典序排序参数
ksort($arr);
$string = $this->toUrlParams($arr);
//签名步骤二:在string后加入KEY
$string = $string . "&key=".C('WECHATPAY_CONFIG')['KEY'];
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}
/**
* 格式化参数格式化成url参数
*/
public function toUrlParams($arr)
{
$buff = "";
foreach ($arr as $k => $v)
{
if($k != "sign" && $v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
/**
* 发起post请求,请求参数为XML
*/
public function postXmlCurl($xml,$url,$second=30)
{
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
//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,FALSE);
//设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data = curl_exec($ch);
//返回结果
if($data)
{
curl_close($ch);
return $data;
}
else
{
$error = curl_errno($ch);
echo "curl出错,错误码:$error"."<br>";
echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
curl_close($ch);
return false;
}
}
/**
* @name 数组格式转换为XML格式
* @param $arr
* @param int $dom
* @param int $item
* @return mixed
*/
function arrayToXml($arr)
{
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."</".$key.">";
}
else
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
$xml.="</xml>";
return $xml;
}
/**
* 作用:将xml转为array
*/
public function xmlToArray($xml)
{
//将XML转为array
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_data;
}
}
<?php
/**
* Created by PhpStorm.
* User: king
* Date: 16/11/3
* Time: 下午3:26
*/
namespace Common\Model\Api;
use Common\Model\BaseModel;
class MyApplyForModel extends BaseModel{
protected $connection = 'DB_APP';
protected $tableName = "my_apply_for";
}
\ No newline at end of file
<?php
namespace Common\Model\Api;
use Common\Model\BaseModel;
class MyAppointmentModel extends BaseModel
{
protected $connection = 'DB_APP';
protected $tableName = "my_appointment";
//订单过期时间2017-05-15 zsc 新增
const EXPIRATION_TIME = 10800;//订单三小时过期
const STATUS_MAKE_NOW = 0;
const STATUS_UNDERWAY = 1;
const STATUS_PERFORM = 2;
const STATUS_ABNORMAL_END = 3;
const STATUS_CANCEL = 4;
/**
* @var 进行状态
*/
public static $_STATUS = [
self::STATUS_MAKE_NOW => '待保洁',
//self::STATUS_UNDERWAY => '进行中',
self::STATUS_PERFORM => '已完成',
self::STATUS_ABNORMAL_END => '异常结束',
self::STATUS_CANCEL => '已取消',
];
const TENANT_COUNT = 99; //租客每月可预约保洁数量 阿东说默认改成99 2018年01月10日15:37:25
const APARTMENT_COUNT = 8;//部门每日预约保洁数量
const TYPE_CLEANING = 1; //保洁预约
const TYPE_REPAIR = 2; //维修预约
const REPAIR_TYPE_PLUMBING = 1;
const REPAIR_TYPE_ELECTRIC = 2;
const REPAIR_TYPE_LOCK = 3;
const REPAIR_TYPE_FURNITURE = 4;
const REPAIR_TYPE_CIRCUIT = 5;
const REPAIR_TYPE_OTHER = 6;
/**
* @var 维修预约类型
*/
public static $_REPAIR_TYPE = [
self::REPAIR_TYPE_PLUMBING => '水暖',
self::REPAIR_TYPE_ELECTRIC => '电器',
self::REPAIR_TYPE_LOCK => '门锁',
self::REPAIR_TYPE_FURNITURE => '家具',
self::REPAIR_TYPE_CIRCUIT => '电路',
self::REPAIR_TYPE_OTHER => '其他',
];
const APPOINTMENT_TIME_TYPE_ALL = 0;
const APPOINTMENT_TIME_TYPE_AM = 1;
const APPOINTMENT_TIME_TYPE_PM = 2;
/**
* @var 预约时段
*/
public static $_APPOINTMENT_TIME_TYPE = [
//self::APPOINTMENT_TIME_TYPE_ALL => '未区分时段',
self::APPOINTMENT_TIME_TYPE_AM => '9:00 - 12:00',
self::APPOINTMENT_TIME_TYPE_PM => '13:00 - 18:00',
];
/**
* @name 预约维修状态
* @var array
*/
public static $_APPOINTMENT_REPAIR_STATUS = [
self::STATUS_MAKE_NOW => '待维修',
self::STATUS_PERFORM => '已完成',
self::STATUS_ABNORMAL_END => '异常结束',
self::STATUS_CANCEL => '已取消',
];
/**
* @name 预约保洁维修状态
* @var array
*/
public static $_APPOINTMENT_CLEANING_STATUS = [
self::STATUS_MAKE_NOW => '待保洁',
self::STATUS_PERFORM => '已完成',
self::STATUS_ABNORMAL_END => '异常结束',
self::STATUS_CANCEL => '已取消',
];
}
\ No newline at end of file
<html>
<head>
<title></title>
<meta charset="UTF-8">
<link href="__CDN_WEIXIN__/client/css/mui.css" rel="stylesheet" />
<link href="__CDN_WEIXIN__/client/css/weui.css" rel="stylesheet" />
<meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'>
</head>
<body>
<script src="__CDN_WEIXIN__client/js/mui.min.js"></script>
<script type="text/javascript" src="__CDN_WEIXIN__client/js/public/config.js"></script>
<script type="text/javascript" src="__CDN_WEIXIN__client/js/showHTML.js"></script>
</body>
</html>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论