2019-08-05 01:02:59
围观(4179)
记录下之前负责的一个项目写过的微信支付(为了以后需要 方便Copy)
public function index() { //支付数据 $data['out_trade_no'] = date('YmdHis') . rand(100, 999); $data['total_fee'] = 10; //此处的值需要是实际金额 * 100 $data['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"]; $data['attach'] = '可以附带的信息'; $data['body'] = '产品信息'; $data['appid'] = 'APPID'; $data['mch_id'] = 'MCHID'; $data['nonce_str'] = md5(time() . rand(0, 999)); $data['trade_type'] = 'NATIVE'; //支付方式 $data['notify_url'] = 'https://bubaijun.com/notify_url'; //异步回调地址 $sign = $this->getParam($data); $dataXML = "<xml> <appid>".$data['appid']."</appid> <attach>".$data['attach']."</attach> <body>".$data['body']."</body> <mch_id>".$data['mch_id']."</mch_id> <nonce_str>".$data['nonce_str']."</nonce_str> <notify_url>".$data['notify_url']."</notify_url> <out_trade_no>".$data['out_trade_no']."</out_trade_no> <spbill_create_ip>".$data['spbill_create_ip']."</spbill_create_ip> <total_fee>".$data['total_fee']."</total_fee> <trade_type>".$data['trade_type']."</trade_type> <sign>".$sign."</sign> </xml>"; $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; //发起HTTP请求 因为用的是 Laravel 框架,所以可以使用GuzzleHttp类 $http = new GuzzleHttp\Client; $response = $http->request('POST', $url, ['body' => $dataXML]); $pay_res = $this->xmlToArray($response->getBody()); if($pay_res['return_code'] == 'SUCCESS' && $pay_res['return_msg'] == 'OK') { //调起支付并成功返回数据 //进行需要的业务逻辑 //然后可以将 code_url 返回给视图并生成二维码 //因为使用的支付方式是 NATIVE 所以将返回的 code_url 生成二维码后使用微信客户端扫码即可支付 } else { //调起支付失败 //返回失败信息 } } private function getParam($paramArray, $isencode = false) { $paramStr = ''; ksort($paramArray); $i = 0; foreach($paramArray as $key => $value){ if ($key == 'Signature'){ continue; } if ($i == 0){ $paramStr .= ''; }else{ $paramStr .= '&'; } $paramStr .= $key . '=' . ($isencode ? urlencode($value) : $value); ++$i; } $key = '微信支付密钥 key'; $stringSignTemp = $paramStr."&key={$key}"; $sign = strtoupper(md5($stringSignTemp)); return $sign; } private function xmlToArray($xml) { libxml_disable_entity_loader(true); $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $val = json_decode(json_encode($xmlstring), true); return $val; } //支付异步回调,使用时记得给该方法写一条路由 public function notify(Request $request) { //微信支付结果 $data_xml = $request->getContent(); if(!$data_xml){ return response()->json([ 'status' => 400, 'msg' => '请勿进行非法操作' ]); } $data = $this->xmlToArray($data_xml); if($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS'){ if($this->checksign($data)) { //订单号 $out_trade_no = $data['out_trade_no']; //金额 需要除以100 才能拿到实际付款金额 $price = $data['total_fee'] / 100; //继续业务逻辑... }else{ Log::info('微信支付返回结果签名验证失败:', $data); } }else{ Log::info('微信支付错误:', $data); } } private function checksign(array $data) { $str = ''; ksort($data); foreach($data as $key => $val) { if($key != 'sign') $str .= $key.'='.$val.'&'; } $key = '微信支付密钥 key'; $temp = $str . "key={$key}"; $sign = strtoupper(md5($temp)); return $sign == $data['sign'] ? true : false; }
当然 以上代码和实际项目中是有出入的,只是记录下来为了以后更好Copy,在实际项目中需要根据需求继续完善并写入业务逻辑。
本文地址 : bubaijun.com/page.php?id=129
版权声明 : 未经允许禁止转载!
上一篇文章: Laravel引入支付宝支付SDK
下一篇文章: 开源PHP轮询即时聊天