热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php充值支付程序,php实现小程序支付完整版

本文实例为大家分享了php实现小程序支付的具体代码,供大家参考,具体内容如下环境:tp3.2小程序微信支付功能开通step1:下载php支

本文实例为大家分享了php实现小程序支付的具体代码,供大家参考,具体内容如下

环境: tp3.2  + 小程序 微信支付功能开通

step1:下载php 支付sdk()  放到library\vendor下,取名wxpay

修改wxpay.config.php 里的appid appsecret key mchid

step2:小程序 js 代码:

var url = getapp().globaldata.httpserver + 'api/buy/pay';

var userid = getapp().globaldata.userid;

var totalmoney = this.data.totalmoney;

var cart = this.data.goods;

var param = {

cart: json.stringify(cart),

cartamount: totalmoney,

userid: userid,

payment: this.data.payment,

addressid: defaultaddress.id

};

var that = this;

util.http(url, param, function (ret) {

if (ret.data.code == 1) {

if (that.data.payment == 'balance') { // 余额支付

that.afterpaysuccess(ret.data.data);

} else { // 微信支付

wx.requestpayment({

timestamp: ret.data.data.timestamp,

noncestr: ret.data.data.noncestr,

package: ret.data.data.package,

signtype: ret.data.data.signtype,

paysign: ret.data.data.paysign,

'success': function (res) {

that.afterpaysuccess(ret.data.data.orderid);

},

'fail': function (res) {

console.log(res);

}

})

}

} else {

util.showtip(ret.data.msg, '提交订单失败');

}

});

/**

* 网络请求

*/

function http(url, params, callback) {

wx.request({

url: url,

data: params,

success: function (res) {

callback(res);

},

fail: function (err) {

console.log(err);

}

});

}

step3:接口代码:

public function pay()

{

$cart = i('cart', '', 'trim');

$cartamount = i('cartamount');

$addressid = i('addressid', 0, 'intval');

$payment = i('payment', '', 'trim');

$userid = $this->userid;

$cart = json_decode($cart, true);

if (empty($cart)) {

$result['msg'] = '购物车获取失败';

$result['code'] = 0;

$this->ajaxreturn($result);

}

$totalmoney = 0;

foreach ($cart as $goods) {

$money = $goods['price']; // price

$selectcount = $goods['selectcount']; // price

$itemamount = number_format($money * $selectcount, 2, '.', '');

$totalmoney += $itemamount;

}

// 检查总金额是否一致

if ($totalmoney != $cartamount) {

$result['msg'] = '总金额不匹配:' . $totalmoney;

$result['code'] = 0;

$this->ajaxreturn($result);

}

// 获取用户地址

$address = m('memberaddress')->where('userid=' . $userid . " and id=" . $addressid)->find();

if (empty($address)) {

$result['msg'] = '用户地址不存在';

$result['code'] = 0;

$this->ajaxreturn($result);

}

// 用户信息

$user = m('member')->where("id=" . $userid)->find();

if ($payment == 'balance') {

if ($user[&#39;amount&#39;] <$cartamount) {

$result[&#39;msg&#39;] &#61; &#39;余额不足&#39;;

$result[&#39;code&#39;] &#61; 0;

$this->ajaxreturn($result);

}

}

// 生成订单

$order[&#39;ordersn&#39;] &#61; $this->genordersn($user[&#39;id&#39;]);

$order[&#39;price&#39;] &#61; $cartamount;

$order[&#39;addressid&#39;] &#61; $address[&#39;id&#39;];

$order[&#39;addressinfo&#39;] &#61; serialize($address); //json_encode($address);

$order[&#39;longitude&#39;] &#61; $address[&#39;longitude&#39;];

$order[&#39;latitude&#39;] &#61; $address[&#39;latitude&#39;];

$order[&#39;addtime&#39;] &#61; time();

$order[&#39;status&#39;] &#61; 0;

$order[&#39;userid&#39;] &#61; $user[&#39;id&#39;];

$order[&#39;paytype&#39;] &#61; $payment;

$order[&#39;paysn&#39;] &#61; &#39;&#39;;

$order[&#39;paytime&#39;] &#61; time();

$orderid &#61; m("order")->add($order);

if ($orderid &#61;&#61; 0) {

$result[&#39;msg&#39;] &#61; &#39;创建订单失败&#39;;

$result[&#39;code&#39;] &#61; 0;

$this->ajaxreturn($result);

}

foreach ($cart as $goods) {

$ordergoods[&#39;orderid&#39;] &#61; $orderid;

$ordergoods[&#39;goodsid&#39;] &#61; $goods[&#39;id&#39;];

$ordergoods[&#39;title&#39;] &#61; $goods[&#39;title&#39;];

$ordergoods[&#39;price&#39;] &#61; $goods[&#39;price&#39;];

$ordergoods[&#39;attr&#39;] &#61; $goods[&#39;attr&#39;];

$ordergoods[&#39;pic&#39;] &#61; $goods[&#39;pic&#39;];

$ordergoods[&#39;num&#39;] &#61; $goods[&#39;selectcount&#39;];

m("ordergoods")->add($ordergoods);

}

if ($payment &#61;&#61; &#39;balance&#39;) {

// 余额支付

$this->balancepay($cartamount, $user[&#39;wxopenid&#39;], $orderid);

} else if ($payment &#61;&#61; &#39;weixin&#39;) {

// 微信支付

$this->weixinpay($cartamount, $user[&#39;wxopenid&#39;], $orderid, $order[&#39;ordersn&#39;]);

}

}

/**

* 微信支付

* &#64;author 大脸猫脸大

* &#64;param $cart

* &#64;param $cartamount

* &#64;param $address

* &#64;param $user

*/

private function weixinpay($cartamount, $openid, $orderid, $ordersn)

{

import("vendor.wxpay.lib.wxpay#api", "", ".php");

//订单号

$money &#61; $cartamount * 100;

$openid &#61; $openid;

$input &#61; new \wxpayunifiedorder();

$input->setbody("迪克-商品");

$input->setout_trade_no("$ordersn");

$input->settotal_fee("$money");

$input->setnotify_url("https://" . $_server[&#39;http_host&#39;] . "/api/buy/paynotify");

$input->settrade_type("jsapi");

$input->setopenid($openid);

$unifiedorder &#61; \wxpayapi::unifiedorder($input);

if ($unifiedorder[&#39;result_code&#39;] &#61;&#61; &#39;success&#39; && $unifiedorder[&#39;return_code&#39;] &#61;&#61; &#39;success&#39;) {

$time &#61; time();

$data[&#39;timestamp&#39;] &#61; "$time"; //时间戳

$data[&#39;noncestr&#39;] &#61; $unifiedorder[&#39;nonce_str&#39;]; //随机字符串

$data[&#39;signtype&#39;] &#61; &#39;md5&#39;; //签名算法&#xff0c;暂支持 md5

$data[&#39;package&#39;] &#61; &#39;prepay_id&#61;&#39; . $unifiedorder[&#39;prepay_id&#39;]; //统一下单接口返回的 prepay_id 参数值&#xff0c;提交格式如&#xff1a;prepay_id&#61;*

$data[&#39;paysign&#39;] &#61; $this->genpaysign($unifiedorder, $time);// 之前以为是$unifiedorder[&#39;sign&#39;]; 后来发现是调用的这种方法. 签名方案参见微信公众号支付帮助文档;

$data[&#39;out_trade_no&#39;] &#61; $ordersn;

$data[&#39;orderid&#39;] &#61; $orderid;

$return[&#39;code&#39;] &#61; 1;

$return[&#39;data&#39;] &#61; $data;

} else {

log::write(var_export($unifiedorder, true), log::err, &#39;&#39;, c(&#39;log_path&#39;)."wx_pay_".date(&#39;y_m_d&#39;).&#39;.log&#39;);

$return[&#39;code&#39;] &#61; 0;

$return[&#39;msg&#39;] &#61; &#39;微信支付失败&#39;;// $unifiedorder[&#39;return_msg&#39;];

}

$this->ajaxreturn($return);

}

/* 生成支付签名*/

private function genpaysign($unifiedorder, $time)

{

$appid &#61; \wxpayconfig::appid;

$noncestr &#61; $unifiedorder[&#39;nonce_str&#39;];

$package &#61; &#39;prepay_id&#61;&#39; . $unifiedorder[&#39;prepay_id&#39;];

$signtype &#61; "md5";

$timestamp &#61; $time;

$key &#61; \wxpayconfig::key;

$sign &#61; md5(sprintf("appid&#61;%s&noncestr&#61;%s&package&#61;%s&signtype&#61;%s×tamp&#61;%s&key&#61;%s", $appid, $noncestr, $package, $signtype, $timestamp, $key));

}

/**

* 支付回调

* &#64;author:大脸猫脸大

*/

public function paynotify()

{

import("vendor.wxpay.lib.wxpay#data", "", ".php");

$xml &#61; $globals[&#39;http_raw_post_data&#39;];

$val &#61; \wxpayresults::init($xml);

if ($val[&#39;result_code&#39;] &#61;&#61; &#39;success&#39; && $val[&#39;return_code&#39;] &#61;&#61; &#39;success&#39;) {

$ordersn &#61; $val[&#39;out_trade_no&#39;];

$transactionid &#61; $val[&#39;transaction_id&#39;];

$data &#61; array(&#39;paytype&#39; &#61;> &#39;weixin&#39;, &#39;status&#39; &#61;> &#39;1&#39;, &#39;paytime&#39; &#61;> time(), &#39;paysn&#39; &#61;> $transactionid);

m("order")->where("ordersn&#61;&#39;$ordersn&#39;")->setfield($data);

exit(&#39;&#39;);

}else {

log::write(var_export($val, true), log::err, &#39;&#39;, c(&#39;log_path&#39;)."wx_pay_notify_".date(&#39;y_m_d&#39;).&#39;.log&#39;);

exit(&#39;&#39;);

}

}

paynotify 回调方法里一定要注意返回

如果不处理&#xff0c;你会发现paynotify  会被执行很多次参见&#xff1a;官方文档

总结一下&#xff1a;

注意二点&#xff0c;1.签名的问题 2. 回调方法的返回处理。

欢迎大家指正。

以上就是本文的全部内容&#xff0c;希望对大家的学习有所帮助&#xff0c;也希望大家多多支持萬仟网。

希望与广大网友互动&#xff1f;&#xff1f;

点此进行留言吧&#xff01;



推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
author-avatar
梅爱敏_629
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有