...
|
...
|
@@ -37,20 +37,66 @@ class PayController extends WeChatBaseController |
|
|
'body' => '十方台',
|
|
|
'detail' => '点亮财神灯',
|
|
|
'out_trade_no' => $data['order_sn'],
|
|
|
'total_fee' => 1, // 单位:分
|
|
|
'total_fee' => $data['money']*100, // 单位:分
|
|
|
'notify_url' => url('portal/pay/notify','','',true), // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
|
|
'openid' => $re['open_id'], // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,
|
|
|
];
|
|
|
|
|
|
$order = new Order($attributes);
|
|
|
|
|
|
$app = new Application($this->options);
|
|
|
$payment = $app->payment;
|
|
|
$result = $payment->prepare($order);
|
|
|
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
|
|
|
//判断支付并发情况
|
|
|
// if (Db::name('light_order')->where(['light_id'=>$data['light_id'],'status'=>1,'end_time'=>['>',time()]])->find()){
|
|
|
// $this->error('该财神灯已被点亮','');
|
|
|
// }
|
|
|
|
|
|
$prepayId = $result->prepay_id;
|
|
|
$jsApiParameters=$payment->configForJSSDKPayment($prepayId);
|
|
|
$this->assign('jsApiParameters',json_encode($jsApiParameters));
|
|
|
$this->assign('list',$data);
|
|
|
return $this->fetch();
|
|
|
}else{
|
|
|
$this->error('支付参数错误','',$result);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
public function demo(){
|
|
|
var_dump(cache('result'));
|
|
|
// var_dump(cache('changecode'));
|
|
|
// var_dump(cache('order'));
|
|
|
}
|
|
|
|
|
|
public function index2(){
|
|
|
$re=$this->checkLogin();
|
|
|
$param=$this->request->param();
|
|
|
|
|
|
$data=Db::name('light_order')->where('id',$param['id'])->find();
|
|
|
$data['price']=Db::name('light')->where('id',$data['light_id'])->find()['price'];
|
|
|
$data['pay_sn']=cmf_get_order_sn();
|
|
|
Db::name('pay')->insert(['order_id'=>$param['id'],'pay_sn'=>$data['pay_sn'],'money'=>$data['price']]);
|
|
|
$attributes = [
|
|
|
'trade_type' => 'JSAPI',
|
|
|
'body' => '十方台',
|
|
|
'detail' => '续费',
|
|
|
'out_trade_no' => $data['pay_sn'],
|
|
|
'total_fee' => $data['price']*100, // 单位:分
|
|
|
'notify_url' => url('portal/pay/notify2','','',true), // 支付结果通知网址,如果不设置则会使用配置里的默认地址
|
|
|
'openid' => $re['open_id'], // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,
|
|
|
];
|
|
|
$order = new Order($attributes);
|
|
|
$app = new Application($this->options);
|
|
|
$payment = $app->payment;
|
|
|
$result = $payment->prepare($order);
|
|
|
cache('result',$result);
|
|
|
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
|
|
|
//判断支付并发情况
|
|
|
// if (Db::name('light_order')->where(['light_id'=>$data['light_id'],'status'=>1,'end_time'=>['>',time()]])->find()){
|
|
|
// $this->error('该财神灯已被点亮','');
|
|
|
// }
|
|
|
|
|
|
$prepayId = $result->prepay_id;
|
|
|
$jsApiParameters=$payment->configForJSSDKPayment($prepayId);
|
|
|
$this->assign('jsApiParameters',json_encode($jsApiParameters));
|
|
|
$this->assign('list',$data);
|
|
|
return $this->fetch();
|
...
|
...
|
@@ -60,6 +106,8 @@ class PayController extends WeChatBaseController |
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 支付回调
|
|
|
* @throws \EasyWeChat\Core\Exceptions\FaultException
|
...
|
...
|
@@ -68,10 +116,7 @@ class PayController extends WeChatBaseController |
|
|
// cache('nnn',111);
|
|
|
$app = new Application($this->options);
|
|
|
$response = $app->payment->handleNotify(function($notify, $successful){
|
|
|
cache('notify',$notify);
|
|
|
cache('successful',$successful);
|
|
|
/*这里是支付回调逻辑处理,一下是DEMO*/
|
|
|
|
|
|
// // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
|
|
|
$out_trade_no=$notify->out_trade_no;
|
|
|
$order = Db::name('light_order')->where('order_sn',$out_trade_no)->find();
|
...
|
...
|
@@ -87,34 +132,87 @@ class PayController extends WeChatBaseController |
|
|
if ($successful) {
|
|
|
// 回填微信的订单号
|
|
|
// $update['transaction_id']=$notify->transaction_id;
|
|
|
// $update['pay_time']=time();
|
|
|
// 不是已经支付状态则修改为已经支付状态
|
|
|
$update['status']=1;
|
|
|
$light=Db::name('light_order')->where('order_sn',$out_trade_no)->find();
|
|
|
$light=Db::name('light')->where('id',$order['light_id'])->find();
|
|
|
//寺庙金额增加
|
|
|
Db::name('temple')->where('id',$light['temple_id'])->setInc('money',$light['price']);
|
|
|
//硬件控制
|
|
|
// $this->lightChange($light['light_id'],'01','01',$light['name']);
|
|
|
} else { // 用户支付失败
|
|
|
$update['status']=0;
|
|
|
}
|
|
|
Db::name('light_order')->where('order_sn',$out_trade_no)->update($update);
|
|
|
Db::name('light_order')->where('order_sn',$out_trade_no)->update(['status'=>1,'pay_time'=>time()]);
|
|
|
$this->lightChange($order['light_id'],'01','01',$order['name'],$order['content']);
|
|
|
//支付成功推送模板消息
|
|
|
$app = new Application($this->options);
|
|
|
$notice = $app->notice;
|
|
|
$userId = Db::name('users')->where('id',$order['users_id'])->find()['open_id'];
|
|
|
$templateId = 'IS6PSpoH7gFVH8Z_MJeXBKQe0g8PEYnhFxBe0-p2Y5A';
|
|
|
$url = '';
|
|
|
$data = array(
|
|
|
"first" => "恭喜您点亮福牌成功!",
|
|
|
"keyword1" => $light['price'],
|
|
|
"keyword2" => $light['term'],
|
|
|
"keyword3" => date('Y-m-d H:i:s',$order['end_time']),
|
|
|
"remark" => "欢迎再次购买!",
|
|
|
);
|
|
|
|
|
|
$result = $notice->uses($templateId)->withUrl($url)->andData($data)->andReceiver($userId)->send();
|
|
|
|
|
|
|
|
|
} else {
|
|
|
// 用户支付失败
|
|
|
Db::name('light_order')->where('order_sn',$out_trade_no)->delete();
|
|
|
}
|
|
|
return true; // 返回处理完成
|
|
|
});
|
|
|
|
|
|
$response->send();
|
|
|
}
|
|
|
|
|
|
public function notify2(){
|
|
|
// cache('nnn',111);
|
|
|
$app = new Application($this->options);
|
|
|
$response = $app->payment->handleNotify(function($notify, $successful){
|
|
|
cache('notify',$notify);
|
|
|
|
|
|
protected function lightChange($id="",$status1='01',$status2='01',$u=""){
|
|
|
/*这里是支付回调逻辑处理,一下是DEMO*/
|
|
|
|
|
|
// // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
|
|
|
$out_trade_no=$notify->out_trade_no;
|
|
|
$order = Db::name('pay')->where('pay_sn',$out_trade_no)->find();
|
|
|
if (!$order) { // 如果订单不存在
|
|
|
return 'Order not exist.'; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
|
|
|
}
|
|
|
// // 如果订单存在
|
|
|
// // 检查订单是否已经更新过支付状态
|
|
|
if ($order['pay_time']!=null) { // 假设订单字段“支付时间”不为空代表已经支付
|
|
|
return true; // 已经支付成功了就不再更新了
|
|
|
}
|
|
|
// // 用户是否支付成功
|
|
|
if ($successful) {
|
|
|
// 回填微信的订单号
|
|
|
// $update['transaction_id']=$notify->transaction_id;
|
|
|
// 不是已经支付状态则修改为已经支付状态
|
|
|
$light_order=Db::name('light_order')->where('id',$order['order_id'])->find();
|
|
|
$light=Db::name('light')->where('id',$light_order['light_id'])->find();
|
|
|
//寺庙金额增加
|
|
|
Db::name('temple')->where('id',$light['temple_id'])->setInc('money',$order['money']);
|
|
|
Db::name('pay')->where('pay_sn',$out_trade_no)->update(['pay_time'=>time()]);
|
|
|
Db::name('light_order')->where('id',$order['order_id'])->update(['end_time'=>strtotime('+'."$light[term]". 'year',$light_order['end_time'])]);
|
|
|
// $this->lightChange($order['light_id'],'01','01',$order['name'],$order['content']);
|
|
|
} else {
|
|
|
return false;
|
|
|
}
|
|
|
return true; // 返回处理完成
|
|
|
});
|
|
|
|
|
|
$response->send();
|
|
|
}
|
|
|
protected function lightChange($id="",$status1='01',$status2='01',$u="",$c=""){
|
|
|
if ($id==""){
|
|
|
return false;
|
|
|
}else {
|
|
|
$light=Db::name('light')->where('id',$id)->find();
|
|
|
$client = fsockopen('114.215.223.17', 5002, $errno, $errmsg, 1);
|
|
|
$code=$light['addr'].'10000000102001'.$light['addr'].$status1.$status2.$this->strtoascii($u).'00';
|
|
|
$code=$light['addr'].'10000000306001'.$light['addr'].$status1.$status2.$this->strtoascii1($u).$this->strtoascii2($c).'00';
|
|
|
$crc=$this->crc16_modbus($code);
|
|
|
$changeCode=$code.substr($crc,2,2).substr($crc,0,2);
|
|
|
// var_dump($queryCode);
|
|
|
$data = array('uid' => $light['number'], 'percent' => "$changeCode");
|
|
|
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
|
|
|
fwrite($client, json_encode($data) . "\n");
|
...
|
...
|
@@ -143,20 +241,73 @@ class PayController extends WeChatBaseController |
|
|
}
|
|
|
return sprintf('%04X', $crc);
|
|
|
}
|
|
|
public function strtoascii($str="潘浩文")
|
|
|
public function strtoascii1($str="")
|
|
|
{
|
|
|
$str = mb_convert_encoding($str, 'GB2312');
|
|
|
if(strlen($str)%2!=0){
|
|
|
$change_after = '';
|
|
|
for ($i = 0; $i < strlen($str); $i = $i + 1) {
|
|
|
$change_after .= dechex(ord($str[$i]));
|
|
|
// var_dump($change_after);
|
|
|
}
|
|
|
}else {
|
|
|
$change_after = '';
|
|
|
for ($i = 0; $i < strlen($str); $i = $i + 2) {
|
|
|
$change_after .= dechex(ord($str[$i])) . dechex(ord($str[$i + 1]));
|
|
|
}
|
|
|
}
|
|
|
for ($i=0;strlen($change_after)<50;$i++){
|
|
|
$change_after=$change_after.'00';
|
|
|
}
|
|
|
return strtoupper($change_after);
|
|
|
}
|
|
|
|
|
|
public function strtoascii2($str="")
|
|
|
{
|
|
|
$str = mb_convert_encoding($str, 'GB2312');
|
|
|
$change_after = '';
|
|
|
for ($i = 0; $i < strlen($str); $i=$i+2) {
|
|
|
$change_after .= dechex(ord($str[$i])).dechex(ord($str[$i+1]));
|
|
|
// var_dump(strlen($str));
|
|
|
if(strlen($str)%2!=0){
|
|
|
$change_after = '';
|
|
|
for ($i = 0; $i < strlen($str); $i = $i + 1) {
|
|
|
$change_after .= dechex(ord($str[$i]));
|
|
|
// var_dump($change_after);
|
|
|
}
|
|
|
}else {
|
|
|
$change_after = '';
|
|
|
for ($i = 0; $i < strlen($str); $i = $i + 2) {
|
|
|
$change_after .= dechex(ord($str[$i])) . dechex(ord($str[$i + 1]));
|
|
|
// var_dump($change_after);
|
|
|
}
|
|
|
}
|
|
|
for ($i=0;strlen($change_after)<52;$i++){
|
|
|
// exit();
|
|
|
for ($i=0;strlen($change_after)<130;$i++){
|
|
|
$change_after=$change_after.'00';
|
|
|
}
|
|
|
return strtoupper($change_after);
|
|
|
}
|
|
|
|
|
|
|
|
|
public function cancel(){
|
|
|
$param=$this->request->param();
|
|
|
Db::name('light_order')->where(['light_id'=>$param['light_id'],'status'=>0])->delete();
|
|
|
$this->redirect(url('portal/index/lightOrder',array('id'=>$param['light_id'])));
|
|
|
}
|
|
|
|
|
|
|
|
|
public function cancel2(){
|
|
|
$param=$this->request->param();
|
|
|
Db::name('pay')->where(['order_id'=>$param['order_id'],'pay_time'=>null])->delete();
|
|
|
$this->redirect(url('portal/user/edit',array('id'=>$param['order_id'])));
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
...
|
...
|
|