/** * * 统一下单,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; }
/** * 二维码支付 */ 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(); }