2019-09-06 23:53:10 +08:00

205 lines
6.6 KiB
PHP
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace wstmart\wechat\controller;
use think\Loader;
use wstmart\common\model\Payments as M;
use wstmart\common\model\Orders as OM;
use wstmart\common\model\LogMoneys as LM;
use wstmart\common\model\ChargeItems as CM;
/**
* ============================================================================
* 微信支付控制器
*/
class Weixinpays extends Base{
/**
* 初始化
*/
private $wxpayConfig;
private $wxpay;
public function _initialize() {
header ("Content-type: text/html; charset=utf-8");
Loader::import('wxpay.WxPayConf');
Loader::import('wxpay.WxJsApiPay');
$this->wxpayConfig = array();
$m = new M();
$this->wxpay = $m->getPayment("weixinpays");
$this->wxpayConfig['appid'] = $this->wxpay['appId']; // 微信公众号身份的唯一标识
$this->wxpayConfig['appsecret'] = $this->wxpay['appsecret']; // JSAPI接口中获取openid
$this->wxpayConfig['mchid'] = $this->wxpay['mchId']; // 受理商ID
$this->wxpayConfig['key'] = $this->wxpay['apiKey']; // 商户支付密钥Key
$this->wxpayConfig['notifyurl'] = url("wechat/weixinpays/notify","",true,true);
$this->wxpayConfig['returnurl'] = url("wechat/orders/index","",true,true);
$this->wxpayConfig['curl_timeout'] = 30;
// 初始化WxPayConf
new \WxPayConf($this->wxpayConfig);
}
public function toPay(){
$data = [];
$payObj = input("payObj/s");
if($payObj=="recharge"){
$cm = new CM();
$itemId = (int)input("itemId/d");
$targetType = (int)input("targetType/d");
$targetId = (int)session('WST_USER.userId');
if($targetType==1){//商家
$targetId = (int)session('WST_USER.shopId');
}
$needPay = 0;
if($itemId>0){
$item = $cm->getItemMoney($itemId);
$needPay = isSet($item["chargeMoney"])?$item["chargeMoney"]:0;
}else{
$needPay = (int)input("needPay/d");
}
$out_trade_no = WSTOrderNo();
$body = "钱包充值";
$data["status"] = $needPay>0?1:-1;
$attach = $payObj."@".$targetId."@".$targetType."@".$needPay."@".$itemId;
$returnurl = url("wechat/logmoneys/usermoneys","",true,true);
}else{
$data['orderNo'] = input('orderNo');
$data['isBatch'] = (int)input('isBatch');
$data['userId'] = (int)session('WST_USER.userId');
$m = new OM();
$rs = $m->getOrderPayInfo($data);
if(empty($rs)){
$this->assign('type','');
return $this->fetch("users/orders/orders_list");
}else{
$pkey = base64_decode(input("pkey"));
$extras = explode ( "@",$pkey);
$m = new OM();
$userId = (int)session('WST_USER.userId');
$obj["userId"] = $userId;
$obj["orderNo"] = input("orderNo");
$obj["isBatch"] = (int)input("isBatch");
$rs = $m->getByUnique();
$this->assign('rs',$rs);
$body = "支付订单";
$order = $m->getPayOrders($obj);
$needPay = $order["needPay"];
$payRand = $order["payRand"];
$out_trade_no = $obj["orderNo"]."a1".$payRand;
$attach = $userId."@".$obj["orderNo"]."@".$obj["isBatch"];
$returnurl = url("wechat/orders/index","",true,true);
}
}
//使用jsapi接口
$jsApi = new \JsApi();
//使用统一支付接口
$unifiedOrder = new \UnifiedOrder();
$openid = session('WST_USER.wxOpenId');
$unifiedOrder->setParameter("openid",$openid);//商品描述
//自定义订单号,此处仅作举例
$unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商户订单号
$unifiedOrder->setParameter("notify_url",$this->wxpayConfig ['notifyurl']);//通知地址
$unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
$unifiedOrder->setParameter("body",$body);//商品描述
$needPay = WSTBCMoney($needPay,0,2);
$unifiedOrder->setParameter("total_fee", $needPay * 100);//总金额
$userId = (int)session('WST_USER.userId');
$this->assign('needPay',$needPay);
$this->assign('returnUrl',$returnurl );
$this->assign('payObj',$payObj);
$unifiedOrder->setParameter("attach",$attach);//附加数据
$prepay_id = $unifiedOrder->getPrepayId();
//=========步骤3使用jsapi调起支付============
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();
$this->assign('jsApiParameters',$jsApiParameters);
return $this->fetch('users/orders/orders_pay');
}
public function toAddonPay() {
$this->assign('payObj',session("addonPay.payObj"));
$this->assign('object',session("addonPay.object"));
$this->assign('needPay',session("addonPay.needPay"));
$this->assign('returnUrl',session("addonPay.returnUrl"));
$this->assign('jsApiParameters',session("addonPay.jsApiParameters"));
$ctr = new \think\addons\Controller();
return $ctr->fetch(session("addonPay.showUrl"));
}
public function notify() {
// 使用通用通知接口
$notify = new \Notify();
// 存储微信的回调
$xml = file_get_contents("php://input");
$notify->saveData ( $xml );
if ($notify->checkSign () == FALSE) {
$notify->setReturnParameter ( "return_code", "FAIL" ); // 返回状态码
$notify->setReturnParameter ( "return_msg", "签名失败" ); // 返回信息
} else {
$notify->setReturnParameter ( "return_code", "SUCCESS" ); // 设置返回码
}
$returnXml = $notify->returnXml ();
if ($notify->checkSign () == TRUE) {
if ($notify->data ["return_code"] == "FAIL") {
// 此处应该更新一下订单状态,商户自行增删操作
} elseif ($notify->data ["result_code"] == "FAIL") {
// 此处应该更新一下订单状态,商户自行增删操作
} else {
$order = $notify->getData ();
$rs = $this->process($order);
if($rs["status"]==1){
echo "SUCCESS";
}else{
echo "FAIL";
}
}
}
}
//订单处理
private function process($order) {
$obj = array();
$obj["trade_no"] = $order['transaction_id'];
$obj["total_fee"] = (float)$order["total_fee"]/100;
$extras = explode ( "@", $order ["attach"] );
if($extras[0]=="recharge"){//充值
$targetId = (int)$extras [1];
$targetType = (int)$extras [2];
$itemId = (int)$extras [4];
$obj["out_trade_no"] = $order['out_trade_no'];
$obj["targetId"] = $targetId;
$obj["targetType"] = $targetType;
$obj["itemId"] = $itemId;
$obj["payFrom"] = 'weixinpays';
// 支付成功业务逻辑
$m = new LM();
$rs = $m->complateRecharge ( $obj );
}else{
$obj["userId"] = $extras[0];
$obj["out_trade_no"] = $extras[1];
$obj["isBatch"] = $extras[2];
$obj["payFrom"] = "weixinpays";
// 支付成功业务逻辑
$m = new OM();
$rs = $m->complatePay ( $obj );
}
return $rs;
}
}