字节跳动(今日头条)小程序支付、支付宝、微信支付完整版

开通支付

开通支付就不做说明了,请直接查看官方文档:https://microapp.bytedance.com/dev/cn/mini-app/develop/open-capacity/payment/mini-app-pay-plugin-reference/application-for-payment

官方参数组装

在这里插入图片描述

具体看文档:https://microapp.bytedance.com/dev/cn/mini-app/develop/open-capacity/payment/tt.pay

小程序代码

 // 支付
run_pay(){
	let service_val = 3; // 1 收银台 3 微信  4 支付宝
    qrxs.get_fetch('https://api.*****.com/pay/pay.html', {'fee':1800,'service':service_val ,'openid':'N2****Xu'}, function (data) {
         let orderInfo = data.data; 
         if (data.status === "success") {           
           tt.pay({
             orderInfo: orderInfo,
             service: service_val,
             getOrderStatus(res) { 
               let { out_order_no } = res;
               return new Promise(function(resolve, reject) {
                 // 商户前端根据 out_order_no 请求商户后端查询微信支付订单状态
                 tt.request({
                   url: "<your-backend-url>",
                   success(res) {
                     // 商户后端查询的微信支付状态,通知收银台支付结果
                     resolve({ code: 0 | 1 | 2 | 3 | 9 });
                   },
                   fail(err) {
                     reject(err);
                   }
                 });
               });
             },
             success(res) {
               console.log(res)
               if (res.code == 0) {
                 // 支付成功处理逻辑,只有res.code=0时,才表示支付成功
                 // 但是最终状态要以商户后端结果为准
               }
             },
             fail(res) {
               console.log(res)
               // 调起收银台失败处理逻辑
             }
           });
         }
     })
   
 },
  • 请求函数封装类

/**
 * 网络请求
 * @param options
 * @return {Promise}
 */
var get_fetch = function (url, data, backFun, method = 'GET') {
    let that = this;
    let headerJson = {
        "QRXS-FROM":'xcx'
    };
    tt.request({
        url: url,
        data: data,
        header: headerJson,
        method: method,
        success: function (ret) {
            try {
                // console.log(ret.data);
                backFun(ret.data);
            } catch (error) {
                console.log(error);
            }
        },
        fail: function (msg, code) {
            console.log(code);
            console.log(msg);
        },
        complete: function () {
        }
    })
}

小程序代码就不做过多的说明了

服务端

/**
 * 今日头条小程序支付
 * @param array $data     订单数据 body、 total_amount ,out_trade_no 必须要
 * @param string $openid  字节跳动的openid
 * @param int $service   1 拉起小程序收银台  3 微信支付 4 支付宝支付
 * @param int $payid     后台支付商户命名,区分cps和自有
 * @return array
 */
function creParamToutiao($data=[],$openid='N2**aXu',$service=1){
    $body = isset($data['body']) ? $data['body'] : '订单说明';
    $total_amount = isset($data['total_amount']) ? $data['total_amount'] : 0; // 订单金额 分
    $out_trade_no = isset($data['out_trade_no']) ? $data['out_trade_no'] : '订单号';

    $now = time();
    $risk_info  = get_client_ip();    //获取用户真实IP(我在这里写了一个获取IP的方法)
    $app_secret = 'u********xe';  	 //头条支付分配给业务方的支付秘钥
    $data = [
        "merchant_id" => "19*****42",          // 头条支付分配给商户的商户号
        'app_id' => "8******2",             // 头条支付分配给商户 app_id,用于获取加签秘钥信息。
        'sign_type' => "MD5",                   // 固定值:MD5。商户生成签名的算法类型
        "timestamp" => $now,           	        // 发送请求的时间戳,精确到秒
        "version" => "2.0",                     // 固定值:2.0
        "trade_type" => "H5",                   // 固定值:H5
        "product_code" => "pay",                // 固定值:pay
        "payment_type" => "direct",             // 固定值:direct
        "currency" => "CNY",                    // 固定值: CNY。币种
        "total_amount" => $total_amount,        // 金额,整型,单位:分(不能有小数)
        'out_order_no' => $out_trade_no,        // 商户订单号
        "uid" => $openid,                       // 用户在商户侧唯一标志,长度:32 位
        "subject" => $body,                     // 商户订单名称;
        "body" => $body,                        // 商户订单详情
        "trade_time" => $now,                   // 下单时间戳,精确到秒
        "valid_time" => "300",                  // 订单有效时间(单位 秒)
        "notify_url" => "https://api.****.com/pay/pay.html", // 回调地址
        'wx_url' => '',          // 调用微信 H5 支付统一下单接口 返回的 mweb_url 字段值(请注意不要进行 urlencode)。 service=3 时必传
        'wx_type' => '',         // wx_url 非空时传 'MWEB'。wx_url 为空时,该字段不传
        'alipay_url' => '',      // 调用支付宝 App 支付所需的支付请求参数 service=4 时必传
    ];
    // 说明:service=3|4 时,merchant_id, app_id, sign_type, sign, wx_url, alipay_url, wx_type 字段值必须是真实信息;
    // 其他字段传非空、符合格式要求内容即可,不强制要求是真实订单信息
    if($service == 3){ // 微信
        $wxDataArr = $this->cre_param_wxH5($total_amount,$body,$out_trade_no);
        $data["wx_url"]  = isset($wxDataArr['mweb_url']) ? $wxDataArr['mweb_url'] : '';       // 调用微信 H5 支付统一下单接口 返回的 mweb_url 字段值(请注意不要进行 urlencode)。 service=3 时必传
        $data["wx_type"]  = 'MWEB';  // wx_url 非空时传 'MWEB'。wx_url 为空时,该字段不传
        $data['notify_url'] = isset($wxDataArr['notify_url']) ? $wxDataArr['notify_url'] : '';
    }
    if($service == 4){ // 支付宝
        $alipayArr = $this->cre_param_alipay($total_amount,$body,$out_trade_no);
        $alipayStr = isset($alipayArr['alipayStr']) ? $alipayArr['alipayStr'] : '';
        $data['notify_url'] = isset($alipayArr['notify_url']) ? $alipayArr['notify_url'] : '';
        $data["alipay_url"]  = $alipayStr;  // 调用支付宝 App 支付所需的支付请求参数 service=4 时必传
    }
    $data["sign"] = $this->getSignContent($data , $app_secret);	//这里写了一个签名的方法
    $data["risk_info"]  = json_encode(['ip' => $risk_info]); // // 支付风控参数。序列化后的 JSON 结构字符串,JSON 结构如下:{ip: '用户外网IP'}
    return $data;
}

/**
 * 字节跳动签名处理
 * @param $params
 * @param $charset
 * @return string
 */
public function getSignContent($params , $app_secret='', $charset='UTF-8') {
    ksort($params);
    $stringToBeSigned = "";
    $i = 0;
    foreach ($params as $k => $v) {
        if(!isset($v) || $v === null || trim($v) === "" || "@" == substr($v, 0, 1)){
            continue;
        }
        // 转换成目标字符集
        if (!empty($v)) {
            $fileType = "UTF-8";
            if (strcasecmp($fileType, $charset) != 0) {
                $v = mb_convert_encoding($v, $charset, $fileType);
            }
        }
        if ($i == 0) {
            $stringToBeSigned .= "$k" . "=" . "$v";
        } else {
            $stringToBeSigned .= "&" . "$k" . "=" . "$v";
        }
        $i++;
    }
    unset ($k, $v);
    return md5($stringToBeSigned.$app_secret);
}

支付宝支付

 /**
 * 支付宝支付
 * @param int $total_amount  订单金额(分)
 * @param string $body  订单说明
 * @param string $out_trade_no // 订单号 
 * @return array
 */
function cre_param_alipay($total_amount=0,$body='',$out_trade_no=''){
    // 进公帐    
    $version_path = 'qrxs_alipay_cert_new';
    $alipayconf = [ 
		'partner'	=> '*****',	//合作者身份id
		'app_id'	=> '*****',	//appid
		'seller_id' => '*****',	//卖家账号
	];
    $notify_url = '/notify/alipay_new';  // 回调地址
     // 支付宝开始
    $total_fee_alip = $total_amount/100;
    $biz_content = [
        "timeout_express"=>"30m",
        "product_code"=>"QUICK_MSECURITY_PAY",
        "total_amount"=>"{$total_fee_alip}",
        "subject"=>"{$body}",
        "body"=>"{$body}",
        "out_trade_no"=>"{$out_trade_no}",
    ];
    $biz_content = json_encode($biz_content);
    $private_key_path = (getcwd()).'/'.$version_path . '/rsa_private_key.pem';
    $alipayParam = array(
        'charset'=>'utf-8',
        'biz_content'=>$biz_content,
        'method'=>'alipay.trade.app.pay',               // 接口名称
        'notify_url'=>$this->notify_host.$notify_url,	//支付完成通知地址
        'app_id'=>$alipayconf['app_id'],				//合作者身份id
        'sign_type'=>'RSA2',
        'version'=>'1.0',
        'timestamp'=>date('Y-m-d H:i:s'),
    );
    $alipayStr = $this->getParamSign($alipayParam,$private_key_path);
    $backData = [
        'alipayStr'=>$alipayStr ,
        'notify_url' =>$alipayParam['notify_url'],
    ];
    return $backData;
}

//支付宝参数签名
private function getParamSign($params = array(),$private_key_path=''){
    $tempEncode = "";
    foreach ($params as $k => $v){
        $tempEncode .= $k . '=' . urlencode($v) . '&';
    }
    $tempEncode = substr($tempEncode, 0, strlen($tempEncode)-1);
    if(get_magic_quotes_gpc()){
        $tempEncode = stripslashes($tempEncode);
    }

    // 签名
    ksort($params);
    $temp = "";
    foreach ($params as $k => $v){
        $temp .= $k . '=' . $v . '&';
    }
    $temp = substr($temp, 0, strlen($temp)-1);
    if(get_magic_quotes_gpc()){
        $temp = stripslashes($temp);
    }
    //支付宝RSA签名
    $priKey = file_get_contents($private_key_path);
    $res = openssl_get_privatekey($priKey);
    openssl_sign($temp, $sign, $res,OPENSSL_ALGO_SHA256);
    openssl_free_key($res);
    $sign = base64_encode($sign);    //base64编码
    return $tempEncode.'&sign='.urlencode($sign);
}

微信H5支付

/**
  * 微信H5支付
  * @param int $total_amount
  * @param string $body
  * @param string $out_trade_no
  * @param int $payid
  * @return array
  */
 function cre_param_wxH5($total_amount=0,$body='',$out_trade_no=''){
     //使用统一支付接口
     $notify_url = $this->notify_host."/Notify/wx_h5_own.html";
     include_once "Application/Vendor/WxPayH5/WxPayPubHelper.php";
     $unifiedOrder = new \UnifiedOrder_pub();
     $unifiedOrder->setParameter("body","{$body}");//商品描述
     //自定义订单号,此处仅作举例
     $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号
     //转分
     $unifiedOrder->setParameter("total_fee","$total_amount");//总金额
     $unifiedOrder->setParameter("notify_url",$notify_url);//通知地址
     $unifiedOrder->setParameter("trade_type","MWEB");//交易类型 调用接口提交的交易类型,取值如下:JSAPI,NATIVE,APP,,H5支付固定传MWEB
     $result = $unifiedOrder->getResult();
     $mweb_url = $result['mweb_url'];
     $prepayid = $result['prepay_id'];
     $data = array(
         "mweb_url"=>$mweb_url,
         'prepayid'=>$prepayid,
         'out_trade_no'=>$out_trade_no,
         'notify_url'=>$notify_url,
     );
     return $data;
 }

支付回调就不写了,支付宝 和微信h5支付的回调应该都比较熟悉了,回调都是一样的

支付宝回调

//支付宝支付回调接口 3.1.0新账号 
public function alipay_new(){

    $this->alipay_config = array(
        'partner'=> '*****',	//合作者身份id
        'private_key_path'=>(getcwd()).'/qrxs_alipay_cert_new/rsa_private_key.pem',
        'ali_public_key_path'=>(getcwd()).'/qrxs_alipay_cert_new/alipay_public_key.pem',
        'cacert'    => (getcwd()).'/qrxs_alipay_cert_new/cacert.pem',
        'sign_type'    => '0001',
        'input_charset' => 'utf-8',
        'transport'    => 'http',
        'seller_id'    => '*****',	//卖家账号
        'notify_url'    => '', // 回调域名
    );
    require_once LIB_PATH."/Event/alipay/alipay_notify_app.class.php";
    //计算得出通知验证结果
    $alipayNotify = new \AlipayNotify($this->alipay_config);
    $verify_result = $alipayNotify->verifyNotify();
    if($verify_result) {
// 逻辑处理
        echo "success";
    } else {
        echo "fail";
    }
}

支付宝回调引用类:https://download.csdn.net/download/qq_23564667/12264188

微信H5支付回调

/*
* 微信h5 回调 cps
 * */
public function wx_h5_cps(){
    //使用通用通知接口
    include_once "Application/Xcx4/Vendor/WxPayH5/WxPayPubHelper.php";
    $notify = new \Notify_pub();

    //存储微信的回调
    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    $notify->saveData($xml);
    //验证签名,并回应微信。
    if($notify->checkSign() == FALSE){
        $notify->setReturnParameter("return_code","FAIL");//返回状态码
        $notify->setReturnParameter("return_msg","签名失败");//返回信息
    }else{
        $notify->setReturnParameter("return_code","SUCCESS");//设置返回码
    }

    //==商户根据实际情况设置相应的处理流程,此处仅作举例=======
    if($notify->checkSign() == TRUE)
    {
        $out_trade_no = $notify->data["out_trade_no"];//订单号
        $trade_no = $notify->data["transaction_id"];//微信支付订单号
        $result_code = $notify->data["result_code"];//业务结果
        $bank_type = $notify->data["bank_type"];//付款银行
        $is_subscribe = $notify->data["is_subscribe"];//是否关注公众号
        $openid = $notify->data["openid"];

        ///支付成功 业务逻辑操作
        echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
    }
    echo '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
}

微信回调引用类:https://download.csdn.net/download/qq_23564667/12264153

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值