热门标签 | 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;



推荐阅读
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • 起因由于我录制过一个小程序的课程,里面有消息模板的讲解。最近有几位同学反馈官方要取消消息模板,使用订阅消息。为了方便大家容易学 PythonFlask构建微信小程序订餐系统 课程。 ... [详细]
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社区 版权所有