/** * * jsApi微信支付示例 * 注意: * 1、微信支付授权目录配置如下 http://test.uctoo.com/addon/Wxpay/Index/jsApiPay/mp_id/ * 2、支付页面地址需带mp_id参数 * 3、管理后台-基础设置-公众号管理,微信支付必须配置的参数都需填写正确 * @param array $mp_id 公众号在系统中的ID * @return 将微信支付需要的参数写入支付页面,显示支付页面 */ public function jsApiPay($mp_id = 0) { empty($mp_id) && ($mp_id = get_mpid()); $params['mp_id'] = $mp_id; //系统中公众号ID $this->assign('mp_id', $params['mp_id']); $uid = get_ucuser_uid(); //获取粉丝用户uid,一个神奇的函数,没初始化过就初始化一个粉丝 if ($uid === false) { $this->error('只可在微信中访问'); } $user = get_uid_ucuser($uid); //获取本地存储公众号粉丝用户信息 $this->assign('user', $user); $url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $surl = get_shareurl(); if (!empty($surl)) { $this->assign('share_url', $surl); } //odata通用订单数据,订单数据可以从订单页面提交过来 $odata['uid'] = $uid; $odata['mp_id'] = $params['mp_id']; // 当前公众号在系统中ID $odata['order_id'] = "time" . date("YmdHis"); // $odata['order_status'] = 1; //不带该字段-全部状态, 2-待发货, 3-已发货, 5-已完成, 8-维权中 $odata['order_total_price'] = 1; //订单总价,单位:分 $odata['buyer_openid'] = $user['openid']; $odata['buyer_nick'] = $user['nickname']; $odata['receiver_mobile'] = $user['mobile']; $odata['product_id'] = 1; $odata['product_name'] = "UCToo"; $odata['product_price'] = 100; //商品价格,单位:分 $odata['product_sku'] = "UCToo_Wxpay"; $odata['product_count'] = 1; $odata['module'] = MODULE_NAME; $odata['model'] = "order"; $odata['aim_id'] = 1; $order = D("Order"); // 实例化order对象 $order->create($odata); // 生成数据对象 $result = $order->add(); // 写入数据 if ($result) { // 如果主键是自动增长型 成功后返回值就是最新插入的值 } //获取公众号信息,jsApiPay初始化参数 $info = get_mpid_appinfo($odata['mp_id']); $this->options['appid'] = $info['appid']; $this->options['mchid'] = $info['mchid']; $this->options['mchkey'] = $info['mchkey']; $this->options['secret'] = $info['secret']; $this->options['notify_url'] = $info['notify_url']; $this->wxpaycfg = new WxPayConfig($this->options); //①、初始化JsApiPay $tools = new JsApiPay($this->wxpaycfg); $wxpayapi = new WxPayApi($this->wxpaycfg); //②、统一下单 $input = new WxPayUnifiedOrder($this->wxpaycfg); //这里带参数初始化了WxPayDataBase // $input->SetAppid($info['appid']);//公众账号ID // $input->SetMch_id($info['mchid']);//商户号 $input->SetBody($odata['product_name']); $input->SetAttach($odata['product_sku']); $input->SetOut_trade_no($odata['order_id']); $input->SetTotal_fee($odata['order_total_price']); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); // $input->SetGoods_tag("WXG"); //商品标记,代金券或立减优惠功能的参数 // $input->SetNotify_url($info['notify_url']); //http://test.uctoo.com/index.php/UShop/Index/notify $input->SetTrade_type("JSAPI"); $input->SetOpenid($user['openid']); $order = $wxpayapi->unifiedOrder($input); $jsApiParameters = $tools->GetJsApiParameters($order); //获取共享收货地址js函数参数 $editAddress = $tools->GetEditAddressParameters(); //③、在支持成功回调通知中处理成功之后的事宜,见 notify.php /** * 注意: * 1、当你的回调地址不可访问的时候,回调通知会失败,可以通过查询订单来确认支付是否成功 * 2、jsapi支付时需要填入用户openid,WxPay.JsApiPay.php中有获取openid流程 (文档可以参考微信公众平台“网页授权接口”, * 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html) */ $this->assign('order', $odata); $this->assign('jsApiParameters', $jsApiParameters); $this->assign('editAddress', $editAddress); $this->display(); }
/** * * 统一下单,WxPayUnifiedOrder中out_trade_no、body、total_fee、trade_type必填 * appid、mchid、spbill_create_ip、nonce_str不需要填入 * @param WxPayUnifiedOrder $inputObj * @param int $timeOut * @throws WxPayException * @return 成功时返回,其他抛异常 */ public function unifiedOrder($inputObj, $timeOut = 6) { $url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //检测必填参数 if (!$inputObj->IsOut_trade_noSet()) { throw new WxPayException("缺少统一支付接口必填参数out_trade_no!"); } else { if (!$inputObj->IsBodySet()) { throw new WxPayException("缺少统一支付接口必填参数body!"); } else { if (!$inputObj->IsTotal_feeSet()) { throw new WxPayException("缺少统一支付接口必填参数total_fee!"); } else { if (!$inputObj->IsTrade_typeSet()) { throw new WxPayException("缺少统一支付接口必填参数trade_type!"); } } } } //关联参数 if ($inputObj->GetTrade_type() == "JSAPI" && !$inputObj->IsOpenidSet()) { throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"); } if ($inputObj->GetTrade_type() == "NATIVE" && !$inputObj->IsProduct_idSet()) { throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!"); } //异步通知url未设置,则使用配置文件中的url if (!$inputObj->IsNotify_urlSet()) { $inputObj->SetNotify_url($this->wxpaycfg->notify_url); //异步通知url } $inputObj->SetAppid($this->wxpaycfg->appid); //公众账号ID $inputObj->SetMch_id($this->wxpaycfg->mchid); //商户号 $inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']); //终端ip //$inputObj->SetSpbill_create_ip("1.1.1.1"); $inputObj->SetNonce_str(self::getNonceStr()); //随机字符串 //签名 $inputObj->SetSign(); $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond(); //请求开始时间 $response = self::postXmlCurl($xml, $url, false, $timeOut); $result = $this->wxpayresults->Init($response); self::reportCostTime($url, $startTimeStamp, $result); //上报请求花费时间 return $result; }