> 헤드라인 > 본문

PHP 초보자가 WeChat 결제 및 Alipay 결제 구현 방법을 배울 수 있는 방법에 대한 튜토리얼

伊谢尔伦
풀어 주다: 2017-07-05 09:53:02
원래의
5685명이 탐색했습니다.

현재 가장 인기 있는 결제 플랫폼인 위챗페이(WeChat Pay)와 알리페이 결제(Alipay Payment)는 거리, 골목, 쇼핑몰, 슈퍼마켓, 편의점 등에서 휴대폰 QR코드를 통해 매우 편리하게 결제가 가능해 현금 사용을 줄인다.

이제 PHP 중국어 웹사이트에서는 PHP 초보자가 WeChat 결제 및 Alipay 결제 구현 방법을 이해할 수 있도록 안내합니다.

가장 먼저 필요한 것은 PHP 지식에 대한 숙달과 이해입니다. 튜토리얼을 통해 배울 수 있습니다:

관련 링크: http://www.php.cn/course/379. html

배우려면 먼저 중국에서 인기 있는 tp5 프레임워크 과정을 수강하세요.

관련 링크: http://www.php.cn/course/486.html

WeChat 결제

프로젝트 전제 조건: 사용 tp 프레임워크 및 PHP 언어입니다. WeChat 플랫폼에서 제공하는 WeChat 결제 인터페이스 파일을 다운로드하여 WxpayAPI


이라는 tp 타사 클래스 라이브러리 공급업체에 배치합니다.

WxpayAPI/lib/WxPay.Api.php 接口访问类;
WxpayAPI/lib/WxPay.Config.php 配置账号信息;
WxpayAPI/lib/WxPay.Data.php 数据对象基础类;
WxpayAPI/lib/WxPay.Exception.php 微信支付API异常类;
WxpayAPI/lib/WxPay.Notify.php 回调基础类
WxpayAPI/example/WxPay.JsApiPay.php JSAPI支付实现类
로그인 후 복사


1. 예 소스 코드가 부분적으로 수정되었습니다

(1) WxPay.Api.php에서

주석 처리 //
require_once "WxPay.Exception.php"; .Data.php ";


(2) WxPay.Config.php에서 가맹점 정보에 따라 APPID, MCHID, KEY 및 APPSECRET을 구성해야 합니다.


(3) WxPay.Data.php에서
주석 처리 //require_once "WxPay.Config.php";

주석 처리

                   //require_once "../lib/WxPay.Api.php";


After 이를 구성한 다음 단계는 우리의 초점입니다.

2. 주문 컨트롤러 GoodsController.class.php에는 주문 함수 Sure()와 콜백 정보 함수 Callback_url()

/**
* 提交订单函数
*/
public function sure() {
  $o_model = D("Wine/Orders");
 
  if (IS_AJAX) {
   $data = I("post.");
   if ($o_model->create($data)) {
 
    if (!sp_check_verify_code()) {
     $this->error("验证码错误!");
    }
 
    #生成随机订单号
    $order_code = 'O' . date('YmdHis') . $o_model->get_order_code(4);
    while ($o_model->findone(array("order_code" => $order_code))) {
     $order_code = 'O' . date('YmdHis') . $o_model->get_order_code(4);
    }
    $data['order_code'] = $order_code;
    $addr[0] = $_POST['prov'];
    $addr[1] = $_POST['city'];
    $addr[2] = $_POST['dist'];
    $addr[3] = $_POST['area'];
    $data['area'] = serialize($addr);
    $data['create_time'] = time();
    $data['update_time'] = time();
 
    if ($data['pay_id'] == 1) {
     $data['order_status'] = 11; //已付款
     $data['status'] = '1';
    } else {
     $data['order_status'] = 10; //待付款
     $data['status'] = '1';
    }
    //函数调用 返回信息
    $this->Callback_url($data);
   } else {
    $this->error($o_model->getError());
   }
  } else {
   $this->error($o_model->getError());
  }
 }
 
 /**
 * 回调信息函数
 * @param type $data
 */
 public function Callback_url($data) {
  $o_model = D("Wine/Orders");
  $add_id = $o_model->add($data);
  if (!$add_id) {
   $this->error("订单提交失败,请稍后重试!");
  }
  if ('4' == $data['pay_id']) {
   if ('4' == $data['pay_id']) {
   //微信支付
   $msg = '正在为您跳转到微信支付页面,请等待……';
   $url = "/index.php/wine/wxpay/index/?o_id=$add_id";
  }
  $this->success("订单提交成功!" . $msg, $url);
 }
로그인 후 복사

3

이 있습니다.[강조! ! ! ]

WxpayController .class.php WeChat 결제 컨트롤러는 WeChat 인터페이스

<?php
 
/**
 * 微信支付接口调用
 */
 
namespace Wine\Controller;
 
use Common\Controller\HomebaseController;
 
class WxpayController extends HomebaseController {
 
 public function _initialize() {
  parent::_initialize();
 
  Vendor("WxpayAPI/example/log");//订单数据写入日志
  //注: 引入第三方类库中的微信接口文件,对于文件名含有.的,皆用#代替连接才能引入,后缀名不写。
  Vendor("WxpayAPI/example/WxPay#JsApiPay");
  Vendor("WxpayAPI/lib/WxPay#Config");
  Vendor("WxpayAPI/lib/WxPay#Data");
  Vendor("WxpayAPI/lib/WxPay#Exception");
  Vendor("WxpayAPI/lib/WxPay#Notify");
  Vendor("WxpayAPI/lib/WxPay#Api");
  //初始化日志
  $logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date(&#39;Y-m-d&#39;) . &#39;.log&#39;);
  $log = \Log::Init($logHandler, 15);
  $this->model = D("Wine/Orders");
  $this->url = MODULE_NAME . &#39;/&#39; . CONTROLLER_NAME . &#39;/index&#39;;
 }
 
 /**
  * 显示支付页面
  *
  */
 public function index() {
  // 判断当前订单是否被支付
  $orderid = I("get.o_id", 0, "intval");
  $orderid || $this->error("非法操作!");
  $this->assign(&#39;orderid&#39;,$orderid);
  $info = $this->model->findone(array("a.id" => $orderid, &#39;a.status&#39; => array(&#39;neq&#39;, &#39;-1&#39;)));
  $info || $this->error("暂未查询到该订单!");
  //10代表订单待支付的状态
  if ($info[&#39;order_status&#39;] != 10) {
   $this->error("订单已支付!");
  }
  //①、获取用户openid
  $tools = new \JsApiPay();
  $openId = $tools->GetOpenid(); #无法使用
  //初始化日志
  \Log::INFO(&#39;订单&#39; . var_export($info, true));
  $out_trade_no = \WxPayConfig::MCHID . date("YmdHis");
  $this->model->where(array("id" => $orderid))->save(array(&#39;out_trade_no&#39; => $out_trade_no));
//  $openId ="123"; #无法使用
  //②、统一下单
  $input = new \WxPayUnifiedOrder();
  $input->SetBody($info[&#39;mode_name&#39;]);
  $input->SetAttach($orderid);
  $input->SetOut_trade_no($out_trade_no);
//  $input->SetTotal_fee($orderArr[&#39;total_price&#39;]*100);实际支付价格
  $input->SetTotal_fee($info[&#39;pay_price&#39;]*100); //测试时请将支付价格改为0.01,土豪请避开此注释
  $this->assign(&#39;pay_price&#39;,$info[&#39;pay_price&#39;]);
  $input->SetTime_start(date("YmdHis"));
  $input->SetTime_expire(date("YmdHis", time() + 600));
//  $input->SetGoods_tag("test");# 优惠券
  $input->SetNotify_url(&#39;http://&#39; . $_SERVER[&#39;HTTP_HOST&#39;] . "/index.php/Wine/Wxpay/callback"); //回调地址
  $input->SetTrade_type("JSAPI");
  $input->SetOpenid($openId);
  $order = \WxPayApi::unifiedOrder($input);
//  echo &#39;<font color="#f00"><b>统一下单支付单信息</b></font><br/>&#39;;
//  $this->printf_info($order);//打印参数
    $this->assign(&#39;o_id&#39;,$orderid);
  $this->assign(&#39;jsApiParameters&#39;, $tools->GetJsApiParameters($order));
  //获取共享收货地址js函数参数
//  $this->assign(&#39;editAddress&#39;, $tools->GetEditAddressParameters());
  $this->display(&#39;wxpay&#39;);
  exit;
 }
 
 /**
  * 打印输出数组信息
  * @param type $data
  */
 public function printf_info($data) {
  foreach ($data as $key => $value) {
   echo "<font color=&#39;#00ff55;&#39;>$key</font> : $value <br/>";
  }
 }
 
 /* 支付成功回调函数 */
 
 public function callback() {
  /* 返回给微信服务器 */
//  $mes = array(
//   &#39;return_code&#39; => &#39;SUCCESS&#39;,
//   &#39;return_msg&#39; => &#39;OK&#39;
//  );
//  $this->ajaxReturn($mes, &#39;XML&#39;);
  $logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date(&#39;Y-m-d&#39;) . &#39;.log&#39;);
  $log = \Log::Init($logHandler, 15);
  //$streamData = isset($GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;]) ? $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;] : &#39;&#39;;
 
  $streamData = file_get_contents(&#39;php://input&#39;);
  if ($streamData != &#39;&#39;) {
   $arr = $this->xmlToArray($streamData);
   \Log::INFO(&#39;支付&#39; . var_export($arr, true));
  } else {
   $ret = false;
  }
  // 回调值
  if (!empty($arr)) {
   # 数据
    \Log::INFO(&#39;数据1&#39; . var_export($arr, true));
   #修改订单状态
   $out_trade_no = $arr[&#39;out_trade_no&#39;];
   $newArr = array(&#39;order_status&#39; => 11,&#39;status&#39;=>1);
   $this->model->where(array("out_trade_no" => $out_trade_no))->save($newArr);
   $info = $this->model->findone(array("a.out_trade_no" => $out_trade_no, &#39;a.status&#39; => array(&#39;neq&#39;, &#39;-1&#39;)));
   $sql = $this->model->getLastSql();
   \Log::INFO(&#39;数据2&#39; . $sql);
   #添加支付记录pay
   $pay = array(
    &#39;payment_code&#39; => &#39;wxpay&#39;,
    &#39;trade_no&#39;=>$info[&#39;order_code&#39;],
    &#39;out_trade_no&#39;=>$out_trade_no,
    &#39;order_id&#39;=>$info[&#39;id&#39;],
    &#39;create_time&#39;=>time()
   );
   M(&#39;payment_record&#39;)->add($pay);   
  }
 
  /* 返回给微信服务器 */
  $mes = array(
   &#39;return_code&#39; => &#39;SUCCESS&#39;,
   &#39;return_msg&#39; => &#39;OK&#39;
  );
  $this->ajaxReturn($mes, &#39;XML&#39;);
 }
 
 //将XML转为array
 public function xmlToArray($xml) {
  //禁止引用外部xml实体
  libxml_disable_entity_loader(true);
  $values = json_decode(json_encode(simplexml_load_string($xml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA)), true);
  return $values;
 }
 
}
 
?>
로그인 후 복사

4에 대한 호출을 구현합니다. 프런트 엔드 WeChat 결제 페이지 wxpay.html

<html>
 <head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
  <link href="TMPLPublic/css/weui.css" rel="external nofollow" type="text/css" rel="stylesheet"/>
  <title>微信订单支付</title>
  <script type="text/javascript">
   //调用微信JS api 支付
   function jsApiCall()
   {
    WeixinJSBridge.invoke(
      &#39;getBrandWCPayRequest&#39;,
      <php> echo $jsApiParameters; </php>,
      function(res) {
       WeixinJSBridge.log(res.err_msg);
       if (res.err_msg == "get_brand_wcpay_request:ok") {
//       alert(res.err_code + res.err_desc + res.err_msg);
        // 成功跳转页面
        window.location.href = &#39;{:U("Orders/pay_ok",array("o_id"=>$o_id))}&#39;;
       } else {
        // 统一跳转
       }
 
      }
    );
   }
 
   function callpay()
   {
    if (typeof WeixinJSBridge == "undefined") {
     if (document.addEventListener) {
      document.addEventListener(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false);
     } else if (document.attachEvent) {
      document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall);
      document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, jsApiCall);
     }
    } else {
     jsApiCall();
    }
   }
  </script>
 </head>
 <body>
  <br/>
  <p class="container" id="container"><p class="msg">
    <p class="weui_msg">
     <p class="weui_icon_area"><i class="weui_icon_success weui_icon_msg"></i></p>
     <p class="weui_text_area">
      <h2 class="weui_msg_title">订单已生成</h2>
      <p class="weui_msg_desc">该笔订单支付金额为:<php> echo $pay_price;</php></p>
     </p>
     <p class="weui_opr_area">
      <p class="weui_btn_area">
       <a href="javascript:;" rel="external nofollow" class="weui_btn weui_btn_primary" onclick="callpay()">立即支付</a>
       <!--<a href="{:U(&#39;Order/pay_ok&#39;,array(&#39;o_id&#39;=>$_GET[&#39;o_id&#39;]))}" rel="external nofollow" class="weui_btn weui_btn_default">取消支付</a>-->
      </p>
     </p>
     <!--     <p class="weui_extra_area">
           <a href="/wap/order/order_det/<?php echo $order[&#39;id&#39;]?>.html" rel="external nofollow" >查看详情</a>
          </p>-->
    </p>
   </p>
  </p>
 </body>
</html>
로그인 후 복사

5 결제가 OrderController.class.php로 이동하고 주문이 완료됩니다. 결제 완료

/**
* 支付页面
*/
 public function pay_ok() {
  $o_id = I("get.o_id", 0, "intval");
  $info = $this->model->findone(array("a.id" => $o_id, &#39;a.status&#39; => array(&#39;neq&#39;, &#39;-1&#39;)));
  if (empty($info)) {
   # 获取最新可用的商品编号
   $goods = D(&#39;Goods&#39;)->where(array(&#39;status&#39; => &#39;1&#39;))->order(&#39;id desc&#39;)->find();
   $this->error("该订单不存在,请重新正确进入", U(&#39;Goods/sale&#39;, array(&#39;id&#39; => $goods[&#39;id&#39;])));
  }
  $this->assign(&#39;imgurl&#39;, "/wine/img/ok.png");
  $this->assign(&#39;tips&#39;, "订购成功");
  if (&#39;4&#39; == $info[&#39;pay_id&#39;]) {
   //微信支付成功
   $this->assign($info);
   $this->display();
  } else {
   $this->assign($info);
   $this->assign(&#39;tips&#39;, "订购失败");
   $this->assign(&#39;imgurl&#39;, "/wine/img/nook.png");
   $this->display();
  }
 }
로그인 후 복사
이로써 위챗 결제가 완료되었습니다.

Alipay로 결제

더 이상 고민할 필요 없이 바로 코드를 살펴보겠습니다!

참고:
1. 결제 파일은 Alipay에서 직접 가져옵니다.
2. 여전히 TP 프레임워크입니다.

【1】파일을 타사 클래스 라이브러리에 넣습니다.



(1)
* 클래스 이름: AlipayConfig.php

* 기능: Alipay

구성 파일

* 구성 수정:

 // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
  $alipay_config[&#39;key&#39;] = &#39;&#39;;//(**从支付宝中获取**)
 
 // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
  $alipay_config[&#39;notify_url&#39;] = &#39;http://&#39; . $_SERVER[&#39;SERVER_NAME&#39;] . &#39;/index.php/Wine/PayCallback/alipay_notify&#39;;
 
 // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
  $alipay_config[&#39;return_url&#39;] = &#39;http://&#39; . $_SERVER[&#39;SERVER_NAME&#39;] . &#39;/index.php?g=Wine&m=Orders&a=alipay_return&#39;;
로그인 후 복사

(2)
* 클래스 이름: AlipayNotify.php * 기능: Alipay 알림 처리 클래스 * 세부 정보: Alipay 인터페이스 알림 반환 처리

(3)
* 클래스 이름: Alipay.php
* 기능: 모바일 웹사이트 결제 인터페이스 접속 페이지
* 세부 내용: Alipay 인터페이스 알림 반환 처리

class Alipay {
 
 public function submit($params) {
//建立请求
  $alipaySubmit = new AlipaySubmit($alipay_config);
  $html_text = $alipaySubmit->buildRequestForm($parameter, "get", "确认");
  return &#39;<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html>
  <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title>支付宝支付</title>
  </head>&#39; . $html_text . &#39;
  </body>
  </html>&#39;;
 }
}
로그인 후 복사

(4)

* 클래스 이름: inform_url.php
* 기능 : Alipay 서버 비동기 알림 페이지
* 내용: Alipay 인터페이스 알림 반환 처리



[2] 결제 비즈니스 로직
(1) GoodsController.class.php ajax_sure()

public function ajax_sure() {<br>
 $data[&#39;order_code&#39;] = $order_code;
 $addr[0] = $_POST[&#39;prov&#39;];
 $addr[1] = $_POST[&#39;city&#39;];
 $addr[2] = $_POST[&#39;dist&#39;];
 $addr[3] = $_POST[&#39;area&#39;];
 $data[&#39;area&#39;] = serialize($addr);
 $data[&#39;create_time&#39;] = time();
 $data[&#39;update_time&#39;] = time();
 $data[&#39;ip&#39;] = $_SERVER[&#39;REMOTE_ADDR&#39;];
 if ($data[&#39;pay_id&#39;] == 1) {
   $data[&#39;order_status&#39;] = 11; //已付款
   $data[&#39;status&#39;] = &#39;1&#39;;
 } else {
   $data[&#39;order_status&#39;] = 10; //待付款
   $data[&#39;status&#39;] = &#39;1&#39;;
 }
 //函数调用 返回信息
 $this->Callback_url($data);
}
/**
  * 回调信息函数
  * @param type $data
  */
 public function Callback_url($data) {
  $o_model = D("Wine/Orders");
  $add_id = $o_model->add($data);
  if (!$add_id) {
   $this->error("订单提交失败,请稍后重试!");
  }<br>
  if (&#39;3&#39; == $data[&#39;pay_id&#39;]) {
   //支付宝支付
   $msg = &#39;正在为您跳转到支付宝支付页面,请等待……&#39;;
   $url = U("Pay/doalipay", array(&#39;o_id&#39; => $add_id));
  }
  $this->success("订单提交成功!" . $msg, $url);
 }
로그인 후 복사

에서 주문 제출 (2) PayController .class .php를 다운로드하세요. 이제 몇 가지 간단한 단계만 거치면 Alipay 결제가 완료됩니다.


추천 관련 기사:


1.

미니 프로그램 결제 기능의 예제 코드 튜토리얼을 공유하세요

2. 온라인 결제에 WeChat 미니 프로그램을 사용하는 방법은 무엇인가요? 온라인 결제 예시 사용법 요약

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿