SetBody($subject); //商品或支付单简要描述 $input->SetAttach($pay_sn); //附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 $out_trade_no = $pay_sn . sprintf("%03d",mt_rand(0,999)); //给微信用的每次重新生成的商户订单SN, 避免二次支付, 数额修改导致支付失败 $input->SetOut_trade_no($out_trade_no);//商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号 $input->SetTotal_fee("{$fee}");//订单总金额,单位为分,详见支付金额 $input->SetTime_start(date("YmdHis")); //订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则 $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则 $input->SetNotify_url(self::wx_notifyurl); $input->SetTrade_type("APP");//JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里,MICROPAY--刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口 //$input->SetTrade_type("JSAPI"); $order = OpenWxPayApi::unifiedOrder($input); $sorder = $this->toString($order); Log::record($sorder, Log::DEBUG); if (array_key_exists('err_code', $order)) { return false; } $ret['appid'] = $order["appid"]; $ret['noncestr'] = OpenWxPayApi::getNonceStr(); $ret['package'] = 'Sign=WXPay'; $ret['partnerid'] = OpenWxPayConfig::MCHID; $ret['prepayid'] = $order['prepay_id']; $timeStamp = time(); $ret['timestamp'] = "{$timeStamp}"; $ret['sign'] = $this->make_sign($ret); return array("data" => $ret); } private function toString($order) { $ret = ''; foreach ($order as $key => $val) { $ret .= $key . "=" . $val; $ret .= '&'; } return $ret; } private function make_sign($values) { //签名步骤一:按字典序排序参数 ksort($values); $string = $this->to_url_params($values); //签名步骤二:在string后加入KEY $string = $string . "&key=" . OpenWxPayConfig::KEY; //签名步骤三:MD5加密 $string = md5($string); //签名步骤四:所有字符转为大写 $result = strtoupper($string); return $result; } private function to_url_params($values) { $buff = ""; foreach ($values as $k => $v) { if ($k != "sign" && $v != "" && !is_array($v)) { $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; } public function on_notify($post) { } }