当前位置: 首页 > news >正文

PHP开发微信支付和支付宝支付实例

本文主要和大家分享PHP开发微信支付和支付宝支付实例,关于支付的流程之类的就不做解释,大家可以自行在php中文网中搜索哦。

 

  • 微信支付

项目前提:本人用的是tp框架,PHP语言下载到微信平台提供的微信支付接口文件,放在了tp第三方类库vendor,命名为WxpayAPI,

1

2

3

4

5

6

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

2

3

4

5

6

7

8

9

10

11

12

13

14

(1)WxPay.Api.php 里注释掉

        //require_once "WxPay.Exception.php";

        //require_once "WxPay.Config.php";

        //require_once "WxPay.Data.php";

  

(2)WxPay.Config.php里

        需要根据商户信息对APPID , MCHID ,KEY , APPSECRET 进行配置。

  

(3)WxPay.Data.php 里注释掉

        //require_once "WxPay.Config.php";

        //require_once "WxPay.Exception.php";

  

(4)WxPay.JsApiPay.php 里注释掉

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

配置好这些,接下来就是我们的重点部分了。

2.在订单控制器GoodsController.class.php有订单函数sure()和回调信息函数 Callback_url()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

/**

* 提交订单函数

*/

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微信支付控制器,实现对微信接口的调用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

<?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;

    }

  

}

  

?>

 

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

<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" 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/>

        <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:;" class="weui_btn weui_btn_primary" onclick="callpay()">立即支付</a>

                            <!--<a href="{:U('Order/pay_ok',array('o_id'=>$_GET['o_id']))}" class="weui_btn weui_btn_default">取消支付</a>-->

                        </p>

                    </p>

                    <!--                    <p class="weui_extra_area">

                                            <a href="/wap/order/order_det/<?php echo $order['id']?>.html">查看详情</a>

                                        </p>-->

                </p>

            </p>

        </p>

    </body>

</html>

 

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

 

到此,微信支付流程结束。

  • 支付宝支付

话不多说,直接上代码!

注:1.支付文件是从支付宝上直接拿过来的2.依旧是TP框架
【1】将文件放入第三方类库:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/**

* 支付页面

*/

    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();

        }

    }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

(1)

  * 类名:AlipayConfig.php

  

  * 功能:支付宝配置文件

  

  * 修改配置:

  

  // 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';

  

(2)

 * 类名:AlipayNotify.php

  

 * 功能:支付宝通知处理类

  

 * 详细:处理支付宝各接口通知返回

  

(3)

 * 类名:Alipay.php

  

 * 功能:手机网站支付接口接入页

  

 * 详细:处理支付宝各接口通知返回

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>';

    }

}

(4)

 * 类名:notify_url.php

  

 * 功能:支付宝服务器异步通知页面

  

 * 详细:处理支付宝各接口通知返回

 

Paste_Image.png

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

【2】支付业务逻辑

(1)GoodsController.class.php 下提交订单 ajax_sure()

  

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);

    }

  

(2)PayController.class.php 下

    /**

     * 支付页面

     */

    public function doalipay() {

        $o_id = I("get.o_id", 0, "intval");

        $info = $this->model->findone(array("a.id" => $o_id, 'a.status' => array('neq', '-1')));

        //10代表订单待支付的状态

        if ($info['order_status'] != 10) {

            $this->error("订单已支付!");

        }

        vendor("Payment.Alipay.Alipay");

        $alipay = new \Alipay();

        $param['order_sn'] = $info['order_code'];

//        $param['order_amount'] = $info['pay_price'];

        $param['order_amount'] = 0.01;//测试支付时,将支付价格设为0.01元,土豪朋友忽略此提示O(∩_∩)O~

        $param['order_subject'] = '支付宝支付测试';

        $param['return_url'] = 'http://' . $_SERVER['SERVER_NAME'] . '/index.php/Wine/Orders/pay_ok/o_id/'.$o_id;

        $return = $alipay->submit($param);

        echo $return;

        exit;

    }

就是这么简单几步,到此,支付宝支付的流程就已经结束了。

相关文章:

  • PHP微信支付开发之微信退款功能示例
  • Yii2.0数据库join关联查询
  • python 读写、创建 文件
  • TMUX会话的使用
  • Git远程操作详解
  • nginx—兼容pathinfo+rewrite隐藏目录
  • 解决thinkphp5的mkdir() Permission denied问题
  • PHP单例模式--典型的三私一公
  • 使用PHPMAILER实现PHP发邮件功能
  • 覆盖索引有何用?
  • Mysql性能优化、Mysql参数优化、Mysql配置优化
  • 搭建git服务器仓库
  • git如何恢复已经push的内容
  • php连接mysql报错:SQLSTATE[HY000] [2002] No such file or directory
  • MySQL分页优化
  • ----------
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 2018一半小结一波
  • Android优雅地处理按钮重复点击
  • Android组件 - 收藏集 - 掘金
  • CAP 一致性协议及应用解析
  • CEF与代理
  • ES6核心特性
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • laravel 用artisan创建自己的模板
  • nginx 负载服务器优化
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从零开始学习部署
  • 当SetTimeout遇到了字符串
  • 订阅Forge Viewer所有的事件
  • 前端技术周刊 2019-01-14:客户端存储
  • 项目实战-Api的解决方案
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​Linux·i2c驱动架构​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # 飞书APP集成平台-数字化落地
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (1)bark-ml
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (BFS)hdoj2377-Bus Pass
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (全注解开发)学习Spring-MVC的第三天
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转载)OpenStack Hacker养成指南
  • *Django中的Ajax 纯js的书写样式1
  • .NET NPOI导出Excel详解
  • .net Stream篇(六)
  • .net 程序发生了一个不可捕获的异常
  • /var/log/cvslog 太大
  • @Autowired @Resource @Qualifier的区别
  • @synthesize和@dynamic分别有什么作用?