抖音小程序收银台支付

吐槽一下字节跳动emmmm(口吐芬芳)文档写的emmmm(口吐芬芳)
而且没有PHP的demo,整的琢磨了好久
话不多说,上教程
1.去支付宝申请app支付
2.签约好到支付宝开发平台,进行公钥私钥的配置**(ps:选RSA加密,尽量用openssl,但是放到支付宝公钥和私钥记得去掉前后缀,用支付宝提供的工具也可以,这个可以直接粘贴到公钥私钥配置,但是后面再后面文件读取要加上)**
3.到抖音小程序里申请支付

/**
 * 小程序支付
 * @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
 */
public function activitybuy($service=1){
    $data=[];
    $openid=$this->request->post('openid');
    $body = isset($data['body']) ? $data['body'] : '订单说明';
    $total_amount = isset($data['total_amount']) ? $data['total_amount'] : 1; // 订单金额 分
    $data['money'] = $total_amount/100;
    $data['openid']= $openid;
    $orderid=Db::name('order')->insertGetId($data);
    $out_trade_no = isset($data['out_trade_no']) ? $data['out_trade_no'] : $orderid;

    $now = time();
    $risk_info  = $this->request->ip();   //获取用户真实IP(我在这里写了一个获取IP的方法)
    $app_secret = 'jy0******************88f';     //头条支付分配给业务方的支付秘钥
    $data = [
        "merchant_id" => "1******************7",          // 头条支付分配给商户的商户号
        'app_id' => "8******************0",             // 头条支付分配给商户 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://******************.com/pay/pay", // 回调地址
        '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,$openid);
        // dump($alipayArr);
        $alipayStr = isset($alipayArr['alipayStr']) ? $alipayArr['alipayStr'] : '';
        $data['notify_url'] = isset($alipayArr['notify_url']) ? $alipayArr['notify_url'] : '';
        $data["alipay_url"]  = $alipayStr;  // 调用支付宝 App 支付所需的支付请求参数 service=4 时必传
    }
    // dump("11111");
    $data["sign"] = $this->getSignContent($data,$app_secret); //这里写了一个签名的方法
    $data["risk_info"]  = json_encode(['ip' => $risk_info]); // // 支付风控参数。序列化后的 JSON 结构字符串,JSON 结构如下:{ip: '用户外网IP'}
    // dump($data);
            //请求服务端支付接口
        // $res =json_decode(http_request($data,'https://tp-pay.snssdk.com/gateway'),true);
    Common::outJson('1000','success',$data);
}



/**
     * 签名处理
     * @param $params
     * @param $charset
     * @return string
     */
    public function getSignContents($params , $charset,$app_secret) {
        ksort($params);
        $stringToBeSigned = "";
        $i = 0;
        foreach ($params as $k => $v) {
            if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
                // 转换成目标字符集
                $v = $this->characet($v, $charset);
                if ($i == 0) {
                    $stringToBeSigned .= "$k" . "=" . "$v";
                } else {
                    $stringToBeSigned .= "&" . "$k" . "=" . "$v";
                }
                $i++;
            }
        }
        $stringToBeSigned = $stringToBeSigned.$app_secret;
        unset ($k, $v);
        return $stringToBeSigned;
    }
    /**
     * 校验$value是否非空
     * @param $value
     * @return  boolean;
     *  if not set ,return true;
     *  if is null , return true;
     **/
    public function checkEmpty($value) {
        if (!isset($value))
            return true;
        if ($value === null)
            return true;
        if (trim($value) === "")
            return true;
        return false;
    }
    /**
     * 转换字符集编码
     * @param $data
     * @param $targetCharset
     * @return string
     */
    public function characet($data, $targetCharset) {
        if (!empty($data)) {
            $fileType = "UTF-8";
            if (strcasecmp($fileType, $targetCharset) != 0) {
                $data = mb_convert_encoding($data, $targetCharset, $fileType);
            }
        }
        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
 */
public  function cre_param_alipay($total_amount=0,$body='',$out_trade_no='',$openid){
    // 进公帐
    $version_path = 'qrxs_alipay_cert_new';
    $alipayconf = [
        'partner'   => '2******************6', //合作者身份id
        'app_id'    => '2******************07', //appid
        'seller_id' => $openid, //卖家账号
    ];
    $notify_url = '/pay/pay/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'=>$_SERVER['HTTP_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签名
    // dump($private_key_path);
    $priKey = file_get_contents($private_key_path);
    // dump($priKey);
    $res = openssl_get_privatekey($priKey);
    // dump($res);
    openssl_sign($temp, $sign, $res,OPENSSL_ALGO_SHA256);
    openssl_free_key($res);
    $sign = base64_encode($sign);    //base64编码
    return $tempEncode.'&sign='.urlencode($sign);
}
/**
  * 微信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;
 }
//支付宝支付回调接口 3.1.0新账号
public function alipay_new(){
    $openid=Session::get('openid');
    $this->alipay_config = array(
        'partner'=> '2*****************6',    //合作者身份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'    => $openid,  //卖家账号
        'notify_url'    => '', // 回调域名
    );
    // dump(LIB_PATH);
    require_once LIB_PATH."/alipay/alipay_notify_app.class.php";
    //计算得出通知验证结果
    $alipayNotify = new \AlipayNotify($this->alipay_config);
    $verify_result = $alipayNotify->verifyNotify();
    // dump($verify_result);
    if($verify_result) {
// 逻辑处理
        echo "success";
    } else {
        echo "fail";
    }
}

请求封装

//通过CURL,发送http的post请求
// 返回xml数据
function http_request($xmldata, $url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);
        curl_setopt($ch,
                    CURLOPT_HTTPHEADER,
                        array(
                            'Content-type: text'
                        )
                    );

        $data = curl_exec($ch);

        curl_close($ch);
        return $data;
    }

对了那个回调要文件需要看的可以去我的下载里
放在面下/thinkphp/library目录下面
不懂可以私信我~~~~~~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值