600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 微信小程序支付统一下单接口and异步回调

微信小程序支付统一下单接口and异步回调

时间:2019-05-18 23:03:02

相关推荐

微信小程序支付统一下单接口and异步回调

统一下单接口:

<?phpnamespace pay;class WxPay{protected $appid;protected $mch_id;protected $key;protected $openid;protected $out_trade_no;protected $body;protected $total_fee;function __construct($openid, $out_trade_no, $body, $total_fee,$notify_url){$this->appid = '';//appid$this->openid = $openid;//用户openid$this->mch_id = '';//mch_id$this->key = '';//key$this->out_trade_no = $out_trade_no;//订单号$this->body = $body;//订单描述$this->total_fee = $total_fee;//金额(分)$this->notify_url = $notify_url;//异步回调地址}public function pay(){//统一下单接口$return = $this->weixinapp();return $return;}//微信小程序接口private function weixinapp(){//统一下单接口$unifiedorder = $this->unifiedorder();if(!$unifiedorder){return false;}$parameters = array('appId' => $this->appid, //小程序ID'timeStamp' => '' . time() . '', //时间戳'nonceStr' => $this->createNoncestr(), //随机串'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包'signType' => 'MD5'//签名方式);//签名$parameters['paySign'] = $this->getSign($parameters);return $parameters;}//统一下单接口private function unifiedorder(){$url = 'https://api.mch./pay/unifiedorder';$parameters = array('appid' => $this->appid, //小程序ID'mch_id' => $this->mch_id, //商户号'nonce_str' => $this->createNoncestr(), //随机字符串'body' => $this->body,//商品描述'out_trade_no' => $this->out_trade_no,//商户订单号'total_fee' => $this->total_fee,//总金额 单位 分'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端IP'notify_url' => $this->notify_url, //通知地址 确保外网能正常访问'openid' => $this->openid, //用户id'trade_type' => 'JSAPI'//交易类型);//统一下单签名$parameters['sign'] = $this->getSign($parameters);$xmlData = $this->arrayToXml($parameters);$return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));if($return['return_code'] == 'SUCCESS' && $return['result_code'] == 'SUCCESS'){return $return;}else{return false;}}private static function postXmlCurl($xml, $url, $second = 30){$ch = curl_init();//设置超时curl_setopt($ch, CURLOPT_TIMEOUT, $second);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验//设置headercurl_setopt($ch, CURLOPT_HEADER, FALSE);//要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//post提交方式curl_setopt($ch, CURLOPT_POST, TRUE);curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);curl_setopt($ch, CURLOPT_TIMEOUT, 40);set_time_limit(0);//运行curl$data = curl_exec($ch);//返回结果if ($data) {curl_close($ch);return $data;} else {$error = curl_errno($ch);curl_close($ch);return $error;}}//数组转换成xmlprivate function arrayToXml($arr){$xml = "<xml>";foreach ($arr as $key => $val) {if (is_array($val)) {$xml .= "<" . $key . ">" . $this->arrayToXml($val) . "</" . $key . ">";} else {$xml .= "<" . $key . ">" . $val . "</" . $key . ">";}}$xml .= "</xml>";return $xml;}//xml转换成数组private function xmlToArray($xml){//禁止引用外部xml实体libxml_disable_entity_loader(true);$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);$val = json_decode(json_encode($xmlstring), true);return $val;}//作用:产生随机字符串,不长于32位private function createNoncestr($length = 32){$chars = "abcdefghijklmnopqrstuvwxyz0123456789";$str = "";for ($i = 0; $i < $length; $i++) {$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);}return $str;}//作用:生成签名private function getSign($Obj){foreach ($Obj as $k => $v) {$Parameters[$k] = $v;}//签名步骤一:按字典序排序参数ksort($Parameters);$String = $this->formatBizQueryParaMap($Parameters, false);//签名步骤二:在string后加入KEY$String = $String . "&key=" . $this->key;//签名步骤三:MD5加密$String = md5($String);//签名步骤四:所有字符转为大写$result_ = strtoupper($String);return $result_;}///作用:格式化参数,签名过程需要使用private function formatBizQueryParaMap($paraMap, $urlencode){$buff = "";ksort($paraMap);foreach ($paraMap as $k => $v) {if ($urlencode) {$v = urlencode($v);}$buff .= $k . "=" . $v . "&";}$reqPar = '';if (strlen($buff) > 0) {$reqPar = substr($buff, 0, strlen($buff) - 1);}return $reqPar;}}

异步回调:

<?phpnamespace pay;class WxPayCallback{/*** @return string*/public function notify($xmlstr){$xmlObj = simplexml_load_string($xmlstr, 'SimpleXMLElement', LIBXML_NOCDATA);$data = json_decode(json_encode($xmlObj),true);if ($this->checkSign($data)) {//校验通过return $data;}return false;}/**校验签名* @param array $arr* @return bool*/private function checkSign(array $arr): bool{$sign = $arr['sign'];unset($arr['sign']);$key=sysconfig('ms','wx_key');//微信商户平台支付设置的keyksort($arr);//根据key升序排序$str=http_build_query($arr);//数组字典排序拼接字符串$stringSignTemp = $str.'&key='.$key;//拼接上key$signValue = md5($stringSignTemp);//md5处理$signValue = strtoupper($signValue);//转大写return $signValue == $sign;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。