微信小程序支付-小程序代码+php

小程序获取用户的openid,在app.js保存下openid

//app.js
App({
  onLaunch: function () {
    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)
    // 登录
    var that = this;
    wx.login({
      success(res) {
        console.log(res);
        if (res.code) {
          // 发起网络请求
          wx.request({
            url: 'https://api.test.top/login.php',
            data: {
              code: res.code
            },
            header: {
              'content-type': "application/x-www-form-urlencoded"
            },
            success(api_result) {
              console.log(api_result.data.data);
              if (api_result.data.status == 1000) {
                that.globalData.openid = api_result.data.data.openid;
                console.log(123);
              } else {
                wx.showToast({
                  title: '获取openid失败',
                  icon: 'none'
                })
              }
              // console.log( api_result );
            }
          })
        } else {
          console.log('登录失败!' + res.errMsg)
        }
      }
    })
    
  },
  globalData: {
    userInfo: null,
    openid:null
  }
})

 

视图页面添加一个按钮,添加点击事件

<button bindtap="wechatTestPay">支付一分钱</button>

js页面

//index.js
//获取应用实例
const app = getApp()

Page({
  data: {
    motto: 'Hello World',
    userInfo: {},
    hasUserInfo: false,
    canIUse: wx.canIUse('button.open-type.getUserInfo')
  },
  //事件处理函数
  bindViewTap: function() {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
  onLoad: function () {
    
    
  },
  wechatTestPay:function( e ){
    var that = this;

    // console.log(app.globalData);
    wx.request({
      url: 'https://接口地址/wechatpay.php',
      data: {
        openid: app.globalData.openid
      },
      header: {
        'content-type': "application/x-www-form-urlencoded"
      },
      success(api_result) {
        console.log(api_result.data.data);
        if (api_result.data.status == 1000) {
          // that.globalData.openid = api_result.data.data.openid;
          wx.requestPayment(
            {
              'timeStamp':api_result.data.data.timeStamp,
              'nonceStr': api_result.data.data.nonceStr,
              'package': api_result.data.data.package,
              'signType': 'MD5',
              'paySign': api_result.data.data.paySign,
              'success': function (res) {
                console.log('success'); 
                console.log(res);
              },
              'fail': function (res) { 
                console.log('fail');
                console.log(res);
              },
              'complete': function (res) {
                console.log('complete');
                console.log(res);
              }
            })



        } else {
          wx.showToast({
            title: '统一下单失败',
            icon: 'none'
          })
        }
        // console.log( api_result );
      }
    })
  }
})

调用服务段接口:

<?php


#微信统一下单接口
$url='https://api.mch.weixin.qq.com/pay/unifiedorder';

$param=[
    #公众账号ID
    'appid'=>'微信小程序id',
    'mch_id'=>'商户id',
    'nonce_str'=>uniqid(),
    'sign_type'=>'MD5',
    'body'=>'test',
    'detail'=>'test',
    'out_trade_no'=>date('Ymd').rand(10000,99999),
    'total_fee'=>1,
    'spbill_create_ip'=>$_SERVER['SERVER_ADDR'],
    'notify_url'=>'https://你的域名/notify.php',
    'trade_type'=>'JSAPI',
    'openid' => $_GET['openid']
];
ksort($param);

$sign_str=urldecode(http_build_query($param));

$sign_str.='&key=商户的密钥';

$sign_str=md5($sign_str);

$param['sign']=strtoupper($sign_str);

//print_r($param);exit;
function CurlPost($url, $param = [],  $is_post = 1,  $timeout = 5 ) 
{
    //初始化curl
    $curl = curl_init();

    // 设置请求的路径
    curl_setopt($curl, CURLOPT_URL, $url);

    if ($is_post == 1) {
        //设置POST提交
        curl_setopt($curl, CURLOPT_POST, 0);
    }

    //显示输出结果  1代表 把接口返回的结果当作一个字符串处理
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    // 设置请求超时时间
    curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);


    if ($is_post == 1) {
        //提交数据 -- 设置post提交的数据
        if (is_array($param)) {

            //http_build_query
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($param));
        } else {
            curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
        }
    }
    //执行请求
    $data = $data_str = curl_exec($curl);
    //处理错误
    if ($error = curl_error($curl)) {
        $log_data = array(
            'url' => $url,
            'param' => $param,
            'error' => '<span style="color:red;font-weight: bold">' . $error . '</span>',
        );

        var_dump($log_data);
        exit;
    }

    # 关闭CURL
    curl_close($curl);


    //json数据转换为数组
    $data = json_decode($data, true);

    if (!is_array($data)) {
        $data = $data_str;
    }

    #调用玩接口之后写一个日志
    $log = [
        'url' => $url,
        'param' => $param,
        'response' => $data_str
    ];
    file_put_contents(__DIR__ . '/wechat.log', print_r($log, true), 8);

    return $data;

}

function arrzxml($arr){
    $xml='<xml version="1.0" encoding="UTF-8">';
    foreach($arr as $key=>$value){
        if(is_numeric($value)){
            $xml.="<".$key.">".$value."</".$key.">";
        }else{
            $xml.="<".$key."><![CDATA[".$value."]]></".$key.">";
        }

    }
    $xml.='</xml>';
//    var_dump($xml);exit;
    return $xml;

}

$xml=arrzxml($param);
$result=CurlPost($url,arrzxml($param));
//echo '<pre/>';
$api_arr = json_decode(  json_encode(simplexml_load_string( $result , 'SimpleXMLElement', LIBXML_NOCDATA) ), true );
if( $api_arr['return_code'] == 'SUCCESS' ){
        # 统一下单接口成功, 再次加密
        $prepay_id = $api_arr['prepay_id'];

        $arr = [
            'appId' => 'appid',
            'timeStamp' =>"".time(),
            'nonceStr' => uniqid(),
            'package' => "prepay_id=$prepay_id",
            'signType' => 'MD5'
        ];

        ksort( $arr );

        $sign_str=urldecode( http_build_query($arr) );

        $sign_str.='&key=商户密钥';

        $sign_str=md5($sign_str);

        $arr['paySign'] = $sign_str;

        $api_return = [
             'status' => 1000,
             'data' => $arr,
             'success' => 'ok'
        ];

}else{
    $api_return = [
        'status' => 1,
        'data' => [],
        'msg' => '统一下单失败'
    ];
}

echo json_encode( $api_return );
exit;

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 微信小程序支付api-v3是微信提供的一种支付方式,它基于RESTful风格的API设计,使用HTTP协议传输数据,全部使用JSON格式,具有优秀的跨平台性能和安全性。本文将为大家提供微信小程序支付api-v3 php的完整代码微信小程序支付api-v3 php完整代码: 首先,需要获取商户的API密钥和证书文件,然后设置请求头信息,代码如下: $merchant_api_secret = 'Your Secret Key'; //商户API密钥 $merchant_cert_file = 'path/to/cert.pem'; //商户证书文件路径 $merchant_key_file = 'path/to/key.pem'; //商户密钥文件路径 $timestamp = time(); $nonce_str = uniqid(); $signature = generate_signature($merchant_api_secret, $timestamp, $nonce_str, $http_method, $http_uri, $query_string, $body); $header = array( 'Authorization: ' . $authorization, 'Accept: application/json', 'Content-Type: application/json', 'User-Agent: your-device', 'Wechatpay-Serial: your-certificate-serial-number', 'Wechatpay-Timestamp: ' . $timestamp, 'Wechatpay-Nonce: ' . $nonce_str, 'Wechatpay-Signature: ' . $signature, ); 然后,我们需要调用微信小程序支付api-v3接口,具体如下: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $api_url); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); curl_setopt($ch, CURLOPT_SSLCERT, $merchant_cert_file); curl_setopt($ch, CURLOPT_SSLKEY, $merchant_key_file); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $http_method); if (!empty($body)){ curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body)); } $response = curl_exec($ch); $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($status_code !== 200){ throw new Exception('微信小程序支付api-v3调用错误,错误代码' . $status_code); } $response_payload = json_decode($response, true); curl_close($ch); 以上就是微信小程序支付api-v3 php的完整代码,通过以上代码可以实现微信小程序支付api-v3的接口调用,实现支付等操作。同时需要注意的是,具体代码需要根据自己的实际情况进行调整。 ### 回答2: 微信小程序支付API-v3是一套用于支付的接口,支持PHP语言,这里提供完整的代码实现。 在使用微信小程序支付API-v3前需要进行身份验证,将私钥转换为PKCS8格式和获取API证书,并将两者合成一个PEM格式的文件。接下来就可以创建支付订单并进行支付了。 以下是PHP代码的示例: ```php <?php require_once "wxpayloader.php"; $wxpayConfig = new WxPayConfig(); // 公众号ID $wxpayConfig->setAppId("your app id"); // 商户号 $wxpayConfig->setMchId("your mch id"); // 商户API秘钥 $wxpayConfig->setApiKey("your api key"); // 商户API证书路径 $wxpayConfig->setSslCertPath("path/to/your/apiclient_cert.pem"); // 商户API证书密钥路径 $wxpayConfig->setSslKeyPath("path/to/your/apiclient_key.pem"); // 微信支付平台API证书路径 $wxpayConfig->setSslRootCaPath("path/to/your/rootca.pem"); // 接口请求地址 $wxpayConfig->setApiUrl("https://api.mch.weixin.qq.com/"); // 验证商户API证书 $result = WxPayApi::sslVerify($wxpayConfig); if($result['result'] != 0) { die("SSL证书验证失败:" . $result['errmsg']); } // 创建订单 $out_trade_no = "20170525" . rand(10000, 99999); $total_fee = 1; $trade_type = "JSAPI"; // 交易类型为小程序支付 $notify_url = "http://your.domain.com/weixin/paynotify.php"; // 支付结果通知URL $wxpayData = new WxPayData(); $wxpayData->setBody("test"); $wxpayData->setOutTradeNo($out_trade_no); $wxpayData->setTotalFee($total_fee); $wxpayData->setTradeType($trade_type); $wxpayData->setNotifyUrl($notify_url); $wxpayData->setOpenid("your openid"); // 用户的openid,小程序通过wx.login获取 // 统一下单 $result = WxPayApi::unifiedOrder($wxpayConfig, $wxpayData); if($result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS') { die("统一下单失败:" . $result['err_code_des']); } // 获取微信小程序支付参数 $prepay_id = $result["prepay_id"]; $wxpayData = new WxPayData(); $wxpayData->setAppId($wxpayConfig->getAppId()); $wxpayData->setTimeStamp(time()); $wxpayData->setNonceStr(WxPayApi::generateNonceStr()); $wxpayData->setPackage("prepay_id=" . $prepay_id); $wxpayData->setSignType("RSA"); // 生成签名 $sign = WxPayApi::generateSignature($wxpayData, $wxpayConfig); // 将签名加到数据包中 $wxpayData->setPaySign($sign); // 返回小程序支付参数 echo json_encode($wxpayData->getValues()); ``` 以上代码首先创建了WxPayConfig对象,将商户号、API密钥、API证书路径等信息设置进去。然后创建订单数据包,通过WxPayApi::unifiedOrder方法提交到微信支付平台统一下单。如果成功,则获取预支付ID,按照微信小程序支付的规定生成签名,再将签名加到数据包中,最终返回给小程序,由小程序前端发起支付请求。 获取API证书和PKCS8格式私钥的方法,请参考微信支付平台官方文档。 ### 回答3: 微信小程序支付 API-v3 提供了一种安全、高效、简便的支付方式,帮助开发者更好地满足用户需求。以下是微信小程序支付 API-v3 PHP 完整代码。 首先,要使用微信小程序支付 API-v3,需要先在微信支付商户平台上注册并开通服务。 接下来,下载 PHP SDK 安装包,将下载得到的文件解压后,将文件夹内的文件复制到项目代码所在的目录中。 在代码中导入 SDK 中的类库: ```php require_once "lib/WxPay.Api.php"; require_once "lib/WxPay.Data.php"; ``` 接着,需要通过商户号和 API 密钥进行身份验证: ```php $config = new WxPayConfig(); $config->SetMerchantId("商户号"); $config->SetKey("API密钥"); ``` 然后,实例化一个统一下单对象,并设置相关支付参数: ```php $input = new WxPayUnifiedOrder(); $input->SetBody("商品描述"); // 商品描述 $input->SetAttach("附加数据"); // 附加数据 $input->SetOut_trade_no("商户订单号"); // 商户订单号 $input->SetNotify_url("回调URL"); // 回调URL $input->SetTotal_fee("总金额"); // 总金额(单位:分) $input->SetTrade_type("JSAPI"); // 交易类型 $input->SetOpenid("用户openid"); // 用户openid ``` 接着,调用统一下单 API 并获取支付参数: ```php $order = WxPayApi::unifiedOrder($config, $input); $prepayId = $order["prepay_id"]; $nonceStr = WxPayApi::getNonceStr(); $timeStamp = time(); $package = "prepay_id=" . $prepayId; $signType = "HMAC-SHA256"; $paySign = WxPayApi::getPaySign($config, $nonceStr, $package, $signType, $timeStamp); ``` 最后,在前端页面中使用获取到的支付参数调起微信支付即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇葩也是花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值