微信公众号援救微信支付流程

微信支付,下载到微信平台提供的微信支付接口文件,一、下载支付宝接口包,选择的是支付宝的接口支付功能,3、微信支付申请核准之后,2、申请微信支付功能,例如安卓(Android)微信APP、IOS微信APP,微信支付是集成在微信客户端的支付功能

图片 9

有关开垦的流水生产线之类的就不做解释,我们可以自动物检疫索!

本文实例汇报了ThinkPHP实现支付宝接口功用的方法。分享给大家供大家参考。具体剖析如下:

那边模拟一个微市廛中购买货品,随后平素通过微信展开付出的情景,

有关微信支付

微信支付

新近做系统,供给贯彻在线支付功效,一挥而就,选取的是支付宝的接口开荒功效,这里小编用的是即时到帐的接口,具体完毕的步子如下:

1、申请微信群众平台账号,首要是身份ID、手提式有线电话机号、营业证照等,申请以往等待微信确认,必要拍照上传集团盖章的一个证实,其余未有新鲜之处;微信报名之后会拿走应用软件ID、APPSECRET等主要参数,前边会用到。

  1. 生存中的微信支付

项近些日子提:本身用的是tp框架,PHP语言
下载到微信平台提供的微信支付接口文件,放在了tp第三方类库vendor,命名称叫WxpayAPI

一、下载支付宝接口包

2、申请微信支付功效,大许多剧情向来填写就可以,主借使付出商品品种、经营范围、对公银行账户等等的,这里走的弯路是商品经营等级次序数十次勾选不对导致申请破产,要专注依据微信的提示进行改变。

现阶段大家平时生活中接触得非常多的线上电子支付办法着重有二种,一种是支付宝,另一种正是微信支付了,微信支付是合两为一在微信客户端的支付作用,所谓微信客户端,首借使微信的运动应用,举例安卓(Android)微信应用程式、IOS微信应用程式,用户能够透过手提式有线电话机的微信APP完结高效的开拓流程,当然,别的的移位应用也足以接入微信支付的接口来达成实现微信支付的具有作用。

图片 1

下载地址:

3、微信支付申请核准之后,微信会向对公账户打一笔小额款项,规定时期内上报确认就可以,然后有一份同意书,点同意具名就可以到位。那样,就能够获得微信支付经纪人号,同期依据教导能够设置开垦KEY和相关密码。

  1. 微信支付格局
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支付实现类

具体怎么着下载,小编就不在罗嗦了~~

4、如若在已经支付了三个商品页面

关键的付出办法有:大伙儿号支付或称网页支付,扫描二维码支付,应用软件支付,除却还应该有刷卡支付等,还应该有某个正是,微信支付以绑定银行卡的赶快支付为根基的。

图片 2

二、重新整理接口包文件,这一步应该算是特别重要的(个人以为),下载下来的接口包文件有广大言语的源码

4.1
通过微信公众平台–公众号设置–功用设置JS接口安全域名和网页授权域名,都设置为xx.xx.xx.xx/demo

  1. 缘何要领悟

1.对源码进行了有个别修改

图片 3

4.2
通过微信商户平台–产品为主–开拓配置配置大伙儿号支付授权目录,设置为

对此我们开拓者来讲,熟谙地理解微信支付的接口成效是不能缺少的,因为现在本身的要做的网络产品中,恐怕是网页,亦大概是移动应用APP,都或许晤面并微信支付,那么接下去让我们来学习即便利用PHP版的微信支付接口吧。

(1)WxPay.Api.php 里注释掉
        //require_once “WxPay.Exception.php”;
        //require_once “WxPay.Config.php”;
        //require_once “WxPay.Data.php”; 

小编们选用 create_direct_pay_by_user-PHP-UTF-8
这几个称呼的接口文件,里面饱含如下文件:

瞩目,这一步很入眼,必须比照准则配置,否则会报“目录未授权”之类的不当,发生在开拓实行时,弹一个会话框

  1. 关于本节课

(2)WxPay.Config.php里
        必要基于商家音讯对APPID , MCHID ,KEY , APPSECRET
进行配备。 

图片 4

5、通过

本门课程首要针对已经开通了微信专营商号且开通微信民众平台微信支付成效种类的学员,那本身从不开通那几个东西怎么学习?若无开通,也没提到,能够一贯使用本学科的代码,因为本节课程使用的是独具费用配置消息使用的都是测验账号提供的,在你读书了调起支付后,如若使用支付成效,那么会生出每一次一分钱的资费,支付到微信PHP开荒包代码中提供的测量试验厂家号中,测量检验账号归属于微信系统。

(3)WxPay.Data.php 里注释掉
        //require_once “WxPay.Config.php”;
        //require_once “WxPay.Exception.php”; 

images文件里是支付宝相关的部分注脚的图形,大家暂不管他,lib文件很关键,是漫天接口的骨干类公事;

6、解压后,会发觉当中有index.php,cert,lib,example等目录,在那之中还应该有叁个doc目录,里面有DEMO使用说明。

下载SDK

(4)WxPay.JsApiPay.php 里注释掉
        //require_once “../lib/WxPay.Api.php”;

alipay.config.php是不非亲非故系参数的安顿文件

7、将lib、cert目录和example中的jsapi.php、WXPay.JsApiPay.php、notify.php、log.php几个文本,以及DEMO根目录下的index.php文件拷贝到

  1. 复制上边包车型地铁链接在浏览器中张开

陈设好这几个,接下去便是我们的机要部分了。

alipayapi.php 是支付宝接口入口文件

8、上面前蒙受多少个文本进行配备和改变:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11\_1

2.在订单调整器GoodsController.class.php有订单函数sure()和回调新闻函数
Callback_url()

notify_url.php 是服务器异步公告页面文件;

8.1.更动index.php中跳转链接,将

  1. 在所展开的页面中甄选PHP版本的SDK下载
/**
* 提交订单函数
*/
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);
 }

return_url.php 是页面跳转同步布告文件;

8.2.修改jsapi.php,将其中$input->SetNotify_url中的//paysdk.weixin.qq.com/example/notify.php修改为

方今的滑坡包名称叫:WxpayAPI_php_v3,下载完结后,解压到桌面,里面一共含有5个公文夹,和七个index.php 文件

3.[重点!!!] WxpayController
.class.php微信支付调控器,达成对微信接口的调用

在ThinkPHP的框架文件下,找到Extend
踏向,再步入Vendor,在Vendor文件夹下,新建文件夹Alipay,把支付宝作为第三方类库引进,然后,复制支付宝接口文件包中lib文件里的持有文件,一共4个公文,如下:

8.3 将WXPay.JsApiPay.php的require_once
“../lib/WxPay.Api.php”;修改为require_once “./lib/WxPay.Api.php”;

cert、doc、example、lib、logs、index.php

<?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('Y-m-d') . '.log');
  $log = \Log::Init($logHandler, 15);
  $this->model = D("Wine/Orders");
  $this->url = MODULE_NAME . '/' . CONTROLLER_NAME . '/index';
 }

 /**
  * 显示支付页面
  *
  */
 public function index() {
  // 判断当前订单是否被支付
  $orderid = I("get.o_id", 0, "intval");
  $orderid || $this->error("非法操作!");
  $this->assign('orderid',$orderid);
  $info = $this->model->findone(array("a.id" => $orderid, 'a.status' => array('neq', '-1')));
  $info || $this->error("暂未查询到该订单!");
  //10代表订单待支付的状态
  if ($info['order_status'] != 10) {
   $this->error("订单已支付!");
  }
  //①、获取用户openid
  $tools = new \JsApiPay();
  $openId = $tools->GetOpenid(); #无法使用
  //初始化日志
  \Log::INFO('订单' . var_export($info, true));
  $out_trade_no = \WxPayConfig::MCHID . date("YmdHis");
  $this->model->where(array("id" => $orderid))->save(array('out_trade_no' => $out_trade_no));
//  $openId ="123"; #无法使用
  //②、统一下单
  $input = new \WxPayUnifiedOrder();
  $input->SetBody($info['mode_name']);
  $input->SetAttach($orderid);
  $input->SetOut_trade_no($out_trade_no);
//  $input->SetTotal_fee($orderArr['total_price']*100);实际支付价格
  $input->SetTotal_fee($info['pay_price']*100); //测试时请将支付价格改为0.01,土豪请避开此注释
  $this->assign('pay_price',$info['pay_price']);
  $input->SetTime_start(date("YmdHis"));
  $input->SetTime_expire(date("YmdHis", time() + 600));
//  $input->SetGoods_tag("test");# 优惠券
  $input->SetNotify_url('http://' . $_SERVER['HTTP_HOST'] . "/index.php/Wine/Wxpay/callback"); //回调地址
  $input->SetTrade_type("JSAPI");
  $input->SetOpenid($openId);
  $order = \WxPayApi::unifiedOrder($input);
//  echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
//  $this->printf_info($order);//打印参数
    $this->assign('o_id',$orderid);
  $this->assign('jsApiParameters', $tools->GetJsApiParameters($order));
  //获取共享收货地址js函数参数
//  $this->assign('editAddress', $tools->GetEditAddressParameters());
  $this->display('wxpay');
  exit;
 }

 /**
  * 打印输出数组信息
  * @param type $data
  */
 public function printf_info($data) {
  foreach ($data as $key => $value) {
   echo "<font color='#00ff55;'>$key</font> : $value <br/>";
  }
 }

 /* 支付成功回调函数 */

 public function callback() {
  /* 返回给微信服务器 */
//  $mes = array(
//   'return_code' => 'SUCCESS',
//   'return_msg' => 'OK'
//  );
//  $this->ajaxReturn($mes, 'XML');
  $logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date('Y-m-d') . '.log');
  $log = \Log::Init($logHandler, 15);
  //$streamData = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';

  $streamData = file_get_contents('php://input');
  if ($streamData != '') {
   $arr = $this->xmlToArray($streamData);
   \Log::INFO('支付' . var_export($arr, true));
  } else {
   $ret = false;
  }
  // 回调值
  if (!empty($arr)) {
   # 数据
    \Log::INFO('数据1' . var_export($arr, true));
   #修改订单状态
   $out_trade_no = $arr['out_trade_no'];
   $newArr = array('order_status' => 11,'status'=>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, 'a.status' => array('neq', '-1')));
   $sql = $this->model->getLastSql();
   \Log::INFO('数据2' . $sql);
   #添加支付记录pay
   $pay = array(
    'payment_code' => 'wxpay',
    'trade_no'=>$info['order_code'],
    'out_trade_no'=>$out_trade_no,
    'order_id'=>$info['id'],
    'create_time'=>time()
   );
   M('payment_record')->add($pay);   
  }

  /* 返回给微信服务器 */
  $mes = array(
   'return_code' => 'SUCCESS',
   'return_msg' => 'OK'
  );
  $this->ajaxReturn($mes, 'XML');
 }

 //将XML转为array
 public function xmlToArray($xml) {
  //禁止引用外部xml实体
  libxml_disable_entity_loader(true);
  $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  return $values;
 }

}

?>

图片 5

8.4
修改lib目录下的WxPay.Config.php文件中定义的应用软件ID、APPKEY、MACH_ID、SECRET等参数,修改为和谐的

为了方便大家学习,笔者早已在侧边的公文管理处上传了相应的一份SDK,我们能够参见学习,不过最佳或许在大团结的微型Computer下载一份,首先大家先在侧面的编纂框中根据顺序,输入指令ls,然后看下输出的是或不是下图,即便出口的是wxPay,那么就输入指令cd
wxPay

4.前端微信支付页面wxpay.html

近期对上述文件进行重命名.

8.5 将lib目录下WxPay.Api.php的第540行左右的

图片 6

<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="__TMPL__Public/css/weui.css" rel="external nofollow" type="text/css" rel="stylesheet"/>
  <title>微信订单支付</title>
  <script type="text/javascript">
   //调用微信JS api 支付
   function jsApiCall()
   {
    WeixinJSBridge.invoke(
      'getBrandWCPayRequest',
      <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 = '{:U("Orders/pay_ok",array("o_id"=>$o_id))}';
       } else {
        // 统一跳转
       }

      }
    );
   }

   function callpay()
   {
    if (typeof WeixinJSBridge == "undefined") {
     if (document.addEventListener) {
      document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
     } else if (document.attachEvent) {
      document.attachEvent('WeixinJSBridgeReady', jsApiCall);
      document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
     }
    } else {
     jsApiCall();
    }
   }
  </script>
 </head>
 <body>
  <br/>
  <div class="container" id="container"><div class="msg">
    <div class="weui_msg">
     <div class="weui_icon_area"><i class="weui_icon_success weui_icon_msg"></i></div>
     <div class="weui_text_area">
      <h2 class="weui_msg_title">订单已生成</h2>
      <p class="weui_msg_desc">该笔订单支付金额为:<php> echo $pay_price;</php></p>
     </div>
     <div 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('Order/pay_ok',array('o_id'=>$_GET['o_id']))}" rel="external nofollow" class="weui_btn weui_btn_default">取消支付</a>-->
      </p>
     </div>
     <!--     <div class="weui_extra_area">
           <a href="/wap/order/order_det/<?php%20echo%20$order['id']?>.html" rel="external nofollow" >查看详情</a>
          </div>-->
    </div>
   </div>
  </div>
 </body>
</html>

alipay_core.function.php重命名叫:Corefunction.php;

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);

image.png

5.支付成功跳转到OrderController.class.php ,订单支付到位

alipay_md5.function.php重命名字为:Md5function.php;

curl_setopt($ch,CURLOPT_SSL_VE驭胜IFYHOST,2);//严厉校验

然后输入指令:sudo php -S
0.0.0.0:80,看输出的是或不是下图的原委,是的话,那么就足以往上边看了,假设不是的话,再重复上边的步调,刷新页面就能够。

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

alipay_notify.class.php重命名称叫:Notify.php;

修改为

图片 7

到此,微信支付流程甘休。

alipay_submit.class.php重命名叫:Submit.php;

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);

image

支付宝支出

然后,展开Submit.php文件,把以下代码去掉;

curl_setopt($ch,CURLOPT_SSL_VEPAJEROIFYHOST,FALSE);//严厉校验2

上面的操作达成后,我们点击左侧的拜访测量试验就足以步入到支付样例主页面了,如下图所示:

话异常少说,直接上代码!

require_once(“alipay_core.function.php”);

这一段不改换,会使得curl出现60的错误。

图片 8

注:
1.支出文件是从支付宝上间接拿过来的
2.依旧是TP框架

require_once(“alipay_md5.function.php”);同样,张开Notify.php文件,把以下两段代码去掉require_once(“alipay_core.function.php”);

8.6 通过经纪人平台–账户主旨–API安全–下载API证书并拷贝覆盖至cert中

image

【1】将文件归入第三方类库:

require_once(“alipay_md5.function.php”);为啥要去掉以上七个文件中的这两段代码,因为在项目中调用接口文件的时候,小编把全数4个着力文件都经过vendor来实行引进。所以,那不再必要导入。

8.7
notify.php是开垦成功战败后的回调,能够在内部定制支付成功后的拍卖操作,如刷新数据库。

页面呈现出了三种支付情势,第一种jsapi是网页支付,第三种刷卡支付,第三种扫码支付,那时候如若您点击jsapi支付以来,网页会提醒请在微信客户端张开链接,为啥会那样吗?那个小编会在后头的科目聊到,除却,扫码支付借使您用微信的扫视二维码扫描了的话,是真的会进来到支付页面的啊。

(1)
  * 类名:AlipayConfig.php 
  * 功用:支付宝配置文件 
  * 修改配置:  

到此,支付宝接口包相关宗旨类库的重新整建基本做到。今后开班在项目中调用;

8.8
在jsapi.php中有获取openid一段,正常未有毛病,但倘诺大伙儿号已经猎取了用户openid,那么将会报code已被挤占的荒谬,这时间接通过赋值的方设置openid就能够了。

文本注明

 // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
  $alipay_config['key'] = '';//(**从支付宝中获取**)

 // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
  $alipay_config['notify_url'] = 'http://' . $_SERVER['SERVER_NAME'] . '/index.php/Wine/PayCallback/alipay_notify';

 // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
  $alipay_config['return_url'] = 'http://' . $_SERVER['SERVER_NAME'] . '/index.php?g=Wine&m=Orders&a=alipay_return';

三、在档案的次序中调用支付宝接口

通过上述各步,基本就可以完结大伙儿号的微信支付效率,

  1. index.php

 (2)
 * 类名:AlipayNotify.php
 * 作用:支付宝通告管理类 
 * 详细:管理支付宝各接口布告重临 

调用分两步:

那个是法定提供的保有花费功用集成化的入口,然则须求专注的是:假设运用到大家温馨的档案的次序中,记得修改对应的链接。

(3)
 * 类名:Alipay.php
 * 成效:手机网址开垦接口接入页 
 * 详细:管理支付宝各接口文告重临

1、在安顿文件中Conf/Config.php文件中对支付宝相关参数进行安插

图片 9

class Alipay {

 public function submit($params) {
//建立请求
  $alipaySubmit = new AlipaySubmit($alipay_config);
  $html_text = $alipaySubmit->buildRequestForm($parameter, "get", "确认");
  return '<!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>' . $html_text . '
  </body>
  </html>';
 }
}

复制代码 代码如下:

image

(4)
 * 类名:notify_url.php
 * 功效:支付宝服务器异步布告页面
 * 详细:管理支付宝各接口通告重临

//支付宝配置参数 
 
‘alipay_config’=>array( 
       ‘partner’ =>’20********50′,  
//这里是您在中标申请支付宝接口后获取到的PID; 
   
‘key’=>’9t***********ie’,//这里是你在成功申请支付宝接口后收获到的Key 
    ‘sign_type’=>strtoupper(‘MD5’), 
    ‘input_charset’=> strtolower(‘utf-8’), 
    ‘cacert’=> getcwd().’\\cacert.pem’, 
    ‘transport’=> ‘http’, 
      ), 
     //以上配置项,是从接口包中alipay.config.php
文件中复制过来,实行安插; 
     
‘alipay’   =>array( 
 //这里是卖主的支付宝账号,也正是您报名接口时登记的开销宝账号 
‘seller_email’=>’pay@xxx.com’, 
 
//这里是异步通知页面url,提交到品种的Pay调控器的notifyurl方法; 
‘notify_url’=>”,  
 
//这里是页面跳转通告url,提交到花色的Pay调节器的returnurl方法; 
‘return_url’=>”, 
 
//支付成功跳转到的页面,笔者那边跳转到项目标User调整器,myorder方法,并传参payed(已支付列表) 
‘successpage’=>’User/myorder?ordtype=payed’,    
 
//支付战败跳转到的页面,笔者这里跳转到项指标User调整器,myorder方法,并传参unpay(未支付列表) 
‘errorpage’=>’User/myorder?ordtype=unpay’,  
),

  1. cert-证书贮存路线

图片 10

2、新建一个PayAction调控器代码如下

注明是公司在利用微信支付作用的时候,进行身份验证用到的,起到一种安全的功效,可是,这两天微信支付仅仅只在选择退款接口只怕吊销订单的时候必要大概会用到证书,为啥是唯恐吧?因为在接口函数中,大家得以接纳是或不是使用证书,不应用也能使用退款或打消订单接口,在我们下载的SDK中,文件夹cert里面包车型客车注脚对应的是微信的测量检验账号的,倘诺,我们拥有协调的微信商家平台的账号,那么大家就可以登入专营商平台,来下载我们和好的证明放到这么些目录。

【2】支付业务逻辑
(1)GoodsController.class.php 下交给订单 ajax_sure()

复制代码 代码如下:

  1. doc-官方文书档案目录
public function ajax_sure() {<br>
 $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();
 $data['ip'] = $_SERVER['REMOTE_ADDR'];
 if ($data['pay_id'] == 1) {
   $data['order_status'] = 11; //已付款
   $data['status'] = '1';
 } else {
   $data['order_status'] = 10; //待付款
   $data['status'] = '1';
 }
 //函数调用 返回信息
 $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 ('3' == $data['pay_id']) {
   //支付宝支付
   $msg = '正在为您跳转到支付宝支付页面,请等待……';
   $url = U("Pay/doalipay", array('o_id' => $add_id));
  }
  $this->success("订单提交成功!" . $msg, $url);
 }

<?php 
class PayAction extends Action{ 
       //在类初始化方法中,引进相关类库     
       public function _initialize() { 
        vendor(‘Alipay.Corefunction’); 
        vendor(‘Alipay.Md5function’); 
        vendor(‘Alipay.Notify’); 
        vendor(‘Alipay.Submit’);     
    } 
     
    //doalipay方法 
         
    public function doalipay(){ 
             
       // require_once(“alipay.config.php”); 
       // require_once(“lib/alipay_submit.class.php”); 
        
       //这里我们通过TP的C函数把陈设项参数读出,赋给$alipay_config; 
       $alipay_config=C(‘alipay_config’);   
 
         
 
        $payment_type = “1”; //支付类型 //必填,不可能修改 
        $notify_url = C(‘alipay.notify_url’);
//服务器异步布告页面路线 
        $return_url = C(‘alipay.return_url’);
//页面跳转同步通告页面路线 
        $seller_email =
C(‘alipay.seller_email’);//商户支付宝帐户必填 
        $out_trade_no = $_POST[‘trade_no’];//商行订单号
通过开垦页面包车型客车表单举行传递,注意要独一! 
        $subject = $_POST[‘ordsubject’];  //订单名称 //必填
通过付出页面包车型大巴表单举行传递 
        $total_fee = $_POST[‘ordtotal_fee’];   //付款金额  //必填
通过支付页面包车型大巴表单举办传递 
        $body = $_POST[‘ordbody’];  //订单描述
通过支付页面包车型地铁表单举办传递 
        $show_url = $_POST[‘ordshow_url’];  //商品展现地方通过开荒页面包车型客车表单举办传递 
        $anti_phishing_key = “”;//防钓鱼时间戳
//若要选拔申请调离用类文件submit中的query_timestamp函数 
        $exter_invoke_ip = get_client_ip(); //客户端的IP地址  
     
        //构造要呼吁的参数数组,没有必要改换 
    $parameter = array( 
        “service” => “create_direct_pay_by_user”, 
        “partner” => trim($alipay_config[‘partner’]), 
        “payment_type”    => $payment_type, 
        “notify_url”    => $notify_url, 
        “return_url”    => $return_url, 
        “seller_email”    => $seller_email, 
        “out_trade_no”    => $out_trade_no, 
        “subject”    => $subject, 
        “total_fee”    => $total_fee, 
        “body”            => $body, 
        “show_url”    => $show_url, 
        “anti_phishing_key”    => $anti_phishing_key, 
        “exter_invoke_ip”    => $exter_invoke_ip, 
        “_input_charset”    =>
trim(strtolower($alipay_config[‘input_charset’])) 
        ); 
        //创设诉求 
        $alipaySubmit = new AlipaySubmit($alipay_config); 
        $html_text =
$alipaySubmit->buildRequestForm($parameter,”post”, “确认”); 
        echo $html_text; 
    } 
         
    function notifyurl(){ 
                  
                //require_once(“alipay.config.php”); 
                //require_once(“lib/alipay_notify.class.php”); 
                 
               
//这里照旧通过C函数来读取配置项,赋值给$alipay_config 
        $alipay_config=C(‘alipay_config’); 
 
        //总计得出通告验证结果 
        $alipayNotify = new AlipayNotify($alipay_config); 
        $verify_result = $alipayNotify->verifyNotify(); 
 
        if($verify_result) { 
               //验证成功 
                  
//获取支付宝的文告再次回到参数,可参看才具文书档案中服务器异步通告参数列表 
           $out_trade_no   = $_POST[‘out_trade_no’];     
//商行订单号 
           $trade_no       = $_POST[‘trade_no’];         
//支付宝交易号 
           $trade_status   = $_POST[‘trade_status’];     
//交易意况 
           $total_fee      = $_POST[‘total_fee’];        
//交易金额 
           $notify_id      = $_POST[‘notify_id’];        
//通告校验ID。 
           $notify_time    = $_POST[‘notify_time’];      
//通告的出殡和埋葬时间。格式为yyyy-MM-dd HH:mm:ss。 
           $buyer_email    = $_POST[‘buyer_email’];      
//买家支付宝帐号; 
                   $parameter = array( 
             “out_trade_no”     => $out_trade_no,
//厂家订单号码; 
             “trade_no”     => $trade_no,     //支付宝交易号; 
             “total_fee”     => $total_fee,    //交易金额; 
             “trade_status”     => $trade_status, //交易情形 
             “notify_id”     => $notify_id,    //布告校验ID。 
             “notify_time”   => $notify_time, 
//通告的出殡和埋葬时间。 
             “buyer_email”   => $buyer_email, 
//买家支付宝帐号; 
           ); 
           if($_POST[‘trade_status’] == ‘TRADE_FINISHED’) { 
                       // 
           }else if ($_POST[‘trade_status’] == ‘TRADE_SUCCESS’)
{                           if(!checkorderstatus($out_trade_no)){ 
               orderhandle($parameter);  
                           //进行订单管理,并传递从支付宝重临的参数; 
               } 
            } 
                echo “success”;        //请不要涂改或删除 
         }else { 
                //验证战败 
                echo “fail”; 
        }     
    } 
     
    function returnurl(){ 
                //底部的拍卖跟上面四个办法一致,这里不罗嗦了! 
        $alipay_config=C(‘alipay_config’); 
        $alipayNotify = new
AlipayNotify($alipay_config);//计算得出文告验证结果 
        $verify_result = $alipayNotify->verifyReturn(); 
        if($verify_result) { 
            //验证成功 
           
//获取支付宝的布告重返参数,可参看技艺文书档案中页面跳转同步文告参数列表 
        $out_trade_no   = $_GET[‘out_trade_no’];     
//厂家订单号 
        $trade_no       = $_GET[‘trade_no’];         
//支付宝交易号 
        $trade_status   = $_GET[‘trade_status’];      //交易意况 
        $total_fee      = $_GET[‘total_fee’];         //交易金额 
        $notify_id      = $_GET[‘notify_id’];        
//文告校验ID。 
        $notify_time    = $_GET[‘notify_time’];      
//公告的出殡和埋葬时间。 
        $buyer_email    = $_GET[‘buyer_email’];      
//买家支付宝帐号;
             
        $parameter = array( 
            “out_trade_no”     => $out_trade_no,     
//厂家订单号码; 
            “trade_no”     => $trade_no,         
//支付宝交易号; 
            “total_fee”      => $total_fee,         //交易金额; 
            “trade_status”     => $trade_status,      //交易情状 
            “notify_id”      => $notify_id,        
//文告校验ID。 
            “notify_time”    => $notify_time,      
//布告的出殡时间。 
            “buyer_email”    => $buyer_email,      
//买家支付宝帐号 
        ); 
         
if($_GET[‘trade_status’] == ‘TRADE_FINISHED’ ||
$_GET[‘trade_status’] == ‘TRADE_SUCCESS’) { 
        if(!checkorderstatus($out_trade_no)){ 
             orderhandle($parameter); 
//实行订单管理,并传递从支付宝再次回到的参数; 
    } 
       
$this->redirect(C(‘alipay.successpage’));//跳转到配置项中布局的费用成功页面; 
    }else { 
        echo “trade_status=”.$_GET[‘trade_status’]; 
       
$this->redirect(C(‘alipay.errorpage’));//跳转到配置项中安顿的支付战败页面; 
    } 
}else { 
    //验证战败 
    //如要调解,请看alipay_notify.php页面的verifyReturn函数 
    echo “支付失败!”; 
    } 


?>

内部包括一些的SDK使用指南音信

 (2)PayController.class.php 下

3、这里有几个开拓管理进度中需求选择的函数,小编把那一个函数写到了类其余Common/common.php中,那样不用手动调用,就能够直接运用那个函数,代码如下:

  1. example-官方接口例子目录