示例#1
0
 /**
  *
  * 统一下单,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 static function unifiedOrder($inputObj, $timeOut = 6)
 {
     // $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
     $url = WxPayConfig::UNIFIED_ORDER_URL;
     //检测必填参数
     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(WxPayConfig::NOTIFY_URL);
         //异步通知url
     }
     // $inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID
     $inputObj->SetAppid(WxPayConfig::$appId);
     $inputObj->SetMch_id(WxPayConfig::$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 = WxPayResults::Init($response);
     self::reportCostTime($url, $startTimeStamp, $result);
     //上报请求花费时间
     return $result;
 }
 public function unifiedorder($openId, $product_id)
 {
     //统一下单
     $input = new WxPayUnifiedOrder();
     $input->SetBody("test");
     $input->SetAttach("test");
     $input->SetOut_trade_no(WxPayConfig::$mchId . date("YmdHis"));
     $input->SetTotal_fee("1");
     $input->SetTime_start(date("YmdHis"));
     $input->SetTime_expire(date("YmdHis", time() + 600));
     $input->SetGoods_tag("test");
     $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
     $input->SetTrade_type("NATIVE");
     $input->SetOpenid($openId);
     $input->SetProduct_id($product_id);
     $result = WxPayApi::unifiedOrder($input);
     // Log::DEBUG("unifiedorder:" . json_encode($result));
     return $result;
 }
示例#3
0
 /**
  * 二维码支付
  */
 public function actionNative()
 {
     $request = Yii::$app->getRequest();
     $params = $request->get();
     if (!isset($params['signature']) || !$params['signature']) {
         // TODO:: 必须传递签名参数
         return;
     }
     $signature = rawurldecode($params['signature']);
     unset($params['signature']);
     $data = arrayToQuery($params);
     $file = dirname(Yii::$app->getBasePath()) . '/common/rsa_key/signature/public_key.pem';
     $result = AsymmetryCrypt::verifySign($data, $signature, $file);
     if (!$result) {
         return;
     }
     $notifyUrl = Url::toRoute(['wxpay/notify'], true);
     $notify = new NativePay();
     $url = '';
     //模式一
     /**
      * 流程:
      * 1、组装包含支付信息的url,生成二维码
      * 2、用户扫描二维码,进行支付
      * 3、确定支付之后,微信服务器会回调预先配置的回调地址,在【微信开放平台-微信支付-支付配置】中进行配置
      * 4、在接到回调通知之后,用户进行统一下单支付,并返回支付信息以完成支付(见:native_notify.php)
      * 5、支付完成之后,微信服务器会通知支付成功
      * 6、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
      */
     //$url = $notify->GetPrePayUrl("123456789");
     //模式二
     /**
      * 流程:
      * 1、调用统一下单,取得code_url,生成二维码
      * 2、用户扫描二维码,进行支付
      * 3、支付完成之后,微信服务器会通知支付成功
      * 4、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
      */
     $input = new WxPayUnifiedOrder();
     $input->SetBody($params['product_name']);
     if (isset($params['attach'])) {
         $input->SetAttach($params['attach']);
     }
     $input->SetOut_trade_no($params['order_sn']);
     $input->SetTotal_fee($params['turnover'] * 100);
     $input->SetTime_start(date('YmdHis', $params['create_time']));
     $input->SetTime_expire(date('YmdHis', $params['expires_time']));
     if (isset($params['product_desc'])) {
         $input->SetGoods_tag($params['product_desc']);
     }
     $input->SetNotify_url($notifyUrl);
     $input->SetTrade_type("NATIVE");
     $input->SetProduct_id($params['product_id']);
     $result = $notify->GetPayUrl($input);
     $url = $result["code_url"];
     $qrCode = new QrCode();
     $qrCode->setText($url)->setSize(100)->setPadding(10)->setErrorCorrection('high')->setForegroundColor(array('r' => 0, 'g' => 0, 'b' => 0, 'a' => 0))->setBackgroundColor(array('r' => 255, 'g' => 255, 'b' => 255, 'a' => 0))->setLabel('')->setLabelFontSize(16)->render();
 }