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



推荐阅读
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 在 ExtJS 中,类的别名(alias)是开发过程中非常有用的一个特性。通过别名,开发者可以使用简短且易于记忆的名称来引用复杂的类名。本文将详细探讨如何在 ExtJS API 中使用和定义别名,并提供实例说明。 ... [详细]
  • andr ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
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社区 版权所有