视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
微信小程序支付PHP代码
2020-11-27 22:09:32 责编:小OO
文档

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

服务器端获取 openid

Getopenid.php

<?php
 header('Content-type: application/json; charset=UTF-8');
 $APPID="";//填写小程序appid
 $SECRET="";//填写小程序secret
 $JSCODE="";
 if(isset($_GET['js_code'])){
 $JSCODE=$_GET['js_code'];
 $url="https://api.weixin.qq.com/sns/jscode2session?appid=".$APPID
 ."&secret=".$SECRET."&js_code=".$JSCODE."&grant_type=authorization_code";
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_URL, $url);
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($curl, CURLOPT_HEADER, 0);
 $data = curl_exec($curl);
 $array=json_decode($data,true);

 curl_close($curl);
 $openid=isset($array['openid'])?$array['openid']:$array['errcode'];
 if($openid=="40029"){
 $response["result"] = 0;
 $response["msg"] = "invalid code";
 $response["openid"] = $openid;
 echo json_encode($response);
 }else{
 $response["result"] = 1;
 $response["msg"] = "user exist";
 $response["openid"] = $openid;
 echo json_encode($response);
 }
 }

小程序存储openid
在app.js中

getUserInfo:function(cb){
 var that = this
 if(this.globalData.userInfo){
 typeof cb == "function" && cb(this.globalData.userInfo)
 }else{
 wx.login({
 success: function (res) {
 if (res.code) {
 var code = res.code;
 wx.getUserInfo({
 success: function (res2) {
 console.log(res2);
 that.globalData.userInfo = res2.userInfo;
 typeof cb == "function" && cb(that.globalData.userInfo)
 var encryptedData = encodeURIComponent(res2.encryptedData);//一定要把加密串转成URI编码
 var iv = res2.iv;
 //请求自己的服务器
 //Login(code, encryptedData, iv);
 wx.showToast({
 title: '正在登录...',
 icon: 'loading',
 duration: 10000
 });
 //请求服务器
 wx.request({
 url: API_URL,//Getopenid.php
 data: {
 js_code: code,
 },
 method: 'GET',
 header: {
 'content-type': 'application/json'
 }, // 设置请求的 header
 success: function (res) {
 // success
 wx.hideToast();
 console.log("JSON:" + res.data);
 if (res.data.result=="1"){//获取openid成功
 wx.setStorage({//存储openid
 key: "openid",
 data: res.data.openid
 })
 }else{
 wx.showToast({
 title: 'openid获取失败',
 icon: 'none',
 duration: 2000
 })
 }
 console.log('服务器返回' + res.data.result);
 console.log('服务器返回' + res.data.msg);
 console.log('服务器返回' + res.data.openid);
 },
 fail: function () {
 // fail
 // wx.hideToast();
 },
 complete: function () {
 // complete
 }
 })
 }
 })
 } else {
 console.log('获取用户登录态失败!' + res.errMsg)
 }
 }
 })
 }
 }

在登陆界面获取openid

var app = getApp()
onLoad: function () {
 console.log('onLoad')
 var that = this
 //调用应用实例的方法获取全局数据
 app.getUserInfo(function(userInfo){//获取用户信息 
 //更新数据
 that.setData({
 userInfo:userInfo
 })
 })
}

通过以上步骤已经获取到openid

支付方法小程序

pay() {
 var that = this;
 if (this.data.totalPrice == 0) {
 return;
 }
 wx.getStorage({//获取存储在本地的openid
 key: 'openid',
 success: function (res) {
 console.log(res.data)
 that.setData({
 openid:res.data,
 })
 var carArray = that.data.carArray;
 var str="";
 for (var i = 0; i < carArray.length; i++) {
 str=str+ carArray[i].num+"个" + carArray[i].name+" ";
 }
 wx.request({
 url: 'Pay.php',//支付接口
 data: {
 openid: res.data,//openid
 total_fee: that.data.totalPrice,//总金额
 body: str,//商品描述
 },
 method:'GET',
 success:function(res){
 console.log(res.data['timeStamp'])
 if(res.data){
 wx.requestPayment({
 'timeStamp': res.data['timeStamp'],
 'nonceStr': res.data['nonceStr'],
 'package': res.data['package'],
 'signType': 'MD5',
 'paySign': res.data['paySign'],
 'success': function (res) {
 wx.showToast({
 title: '支付成功',
 icon: 'succes',
 duration: 1000,
 mask: true
 })
 //支付成功后在数据库减去购买商品的数量
 var carArray = that.data.carArray;
 for (var i = 0; i < carArray.length; i++) {
 that.setData({
 jiesuan_num: carArray[i].num,
 jiesuan_id: carArray[i].goods_id,
 })
 DeGood(that);
 }
 },
 'fail': function (res) {
 wx.showToast({
 title: '支付失败',
 icon: 'none',
 duration: 1000,
 mask: true
 })
 }
 })
 }
 }
 })
 }
 })
 },

Pay.php

<?php
 include 'WeixinPay.php'; 
 $appid=''; //小程序appid
 $openid= $_GET['openid']; 
 $mch_id=''; //商户id
 $key=''; //商户key
 $out_trade_no = $mch_id. time(); 
 $total_fee = $_GET['total_fee']; 
 $body= $_GET['body'];
 if(empty($total_fee)){ 
 $body = $body; 
 $total_fee = floatval(99*100); 
 }else{ 
 $body = $body; 
 $total_fee = floatval($total_fee*100); 
 } 
 $weixinpay = new WeixinPay($appid,$openid,$mch_id,$key,$out_trade_no,$body,$total_fee); 
 $return=$weixinpay->pay(); 
 echo json_encode($return); 

WeixinPay.php

<?php


/*
 * 小程序微信支付
 */


class WeixinPay {


 protected $appid;
 protected $mch_id;
 protected $key;
 protected $openid;
 protected $out_trade_no;
 protected $body;
 protected $total_fee;
 function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee) {
 $this->appid = $appid;
 $this->openid = $openid;
 $this->mch_id = $mch_id;
 $this->key = $key;
 $this->out_trade_no = $out_trade_no;
 $this->body = $body;
 $this->total_fee = $total_fee;
 }


 public function pay() {
 //统一下单接口
 $return = $this->weixinapp();
 return $return;
 }


 //统一下单接口
 private function unifiedorder() {
 $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
 $parameters = array(
 'appid' => $this->appid, //小程序ID
 'mch_id' => $this->mch_id, //商户号
 'nonce_str' => $this->createNoncestr(), //随机字符串
// 'body' => 'test', //商品描述
 'body' => $this->body,
// 'out_trade_no' => '2015450806125348', //商户订单号
 'out_trade_no'=> $this->out_trade_no,
// 'total_fee' => floatval(0.01 * 100), //总金额 单位 分
 'total_fee' => $this->total_fee,
// 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端IP
 'spbill_create_ip' => '192.168.0.161', //终端IP
 'notify_url' => 'http://www.weixin.qq.com/wxpay/pay.php', //通知地址 确保能正常访问
 'openid' => $this->openid, //用户id
 'trade_type' => 'JSAPI'//交易类型
 );
 //统一下单签名
 $parameters['sign'] = $this->getSign($parameters);
 $xmlData = $this->arrayToXml($parameters);
 $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));
 return $return;
 }


 private static function postXmlCurl($xml, $url, $second = 30) 
 {
 $ch = curl_init();
 //设置超时
 curl_setopt($ch, CURLOPT_TIMEOUT, $second);
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验
 //设置header
 curl_setopt($ch, CURLOPT_HEADER, FALSE);
 //要求
结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //post提交方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); curl_setopt($ch, CURLOPT_TIMEOUT, 40); set_time_limit(0); //运行curl $data = curl_exec($ch); //返回结果 if ($data) { curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); throw new WxPayException("curl出错,错误码:$error"); } } //数组转换成xml private function arrayToXml($arr) { $xml = "<root>"; foreach ($arr as $key => $val) { if (is_array($val)) { $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">"; } else { $xml .= "<" . $key . ">" . $val . "</" . $key . ">"; } } $xml .= "</root>"; return $xml; } //xml转换成数组 private function xmlToArray($xml) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $val = json_decode(json_encode($xmlstring), true); return $val; } //微信小程序接口 private function weixinapp() { //统一下单接口 $unifiedorder = $this->unifiedorder(); // print_r($unifiedorder); $parameters = array( 'appId' => $this->appid, //小程序ID 'timeStamp' => '' . time() . '', //时间戳 'nonceStr' => $this->createNoncestr(), //随机串 'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包 'signType' => 'MD5'//签名方式 ); //签名 $parameters['paySign'] = $this->getSign($parameters); return $parameters; } //作用:产生随机字符串,不长于32位 private function createNoncestr($length = 32) { $chars = "abcdefghijklmnopqrstuvwxyz01234567"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } //作用:生成签名 private function getSign($Obj) { foreach ($Obj as $k => $v) { $Parameters[$k] = $v; } //签名步骤一:按字典序排序参数 ksort($Parameters); $String = $this->formatBizQueryParaMap($Parameters, false); //签名步骤二:在string后加入KEY $String = $String . "&key=" . $this->key; //签名步骤三:MD5加密 $String = md5($String); //签名步骤四:所有字符转为大写 $result_ = strtoupper($String); return $result_; } ///作用:格式化参数,签名过程需要使用 private function formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if ($urlencode) { $v = urlencode($v); } $buff .= $k . "=" . $v . "&"; } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff) - 1); } return $reqPar; } }

下载本文
显示全文
专题