字节跳动(今日头条)小程序支付、支付宝、微信支付完整版
字节跳动(今日头条)小程序支付
- 开通支付
- 官方参数组装
- 小程序代码
- 服务端
- 支付宝支付
- 微信H5支付
- 支付宝回调
- 微信H5支付回调
开通支付
开通支付就不做说明了,请直接查看官方文档: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
字节跳动(今日头条)小程序支付、支付宝、微信支付完整版相关推荐
- 关于今日头条小程序(字节跳动小程序)相关问题
上周突然遇到让开发今日头条小程序(字节跳动小程序)的需求,然后看了下文档发现真的简陋.而且文档有错别字.槽点有点多.但是和老版本的小程序相差不多,然后我就抱着试一试的心态,真的是试一试把微信小程序换了 ...
- 微信封杀今日头条小程序;英特尔敲定新 CEO;快手成央视春晚官方合作伙伴 | 雷锋早报...
英特尔正式任命罗伯特·斯万为新任 CEO 1月31日据外媒消息,英特尔最终确认任命临时 CEO 罗伯特·斯万正式接任CEO一职. 此前受到英特尔前 CEO 科再奇丑闻影响,英特尔CEO临时由罗伯特·斯 ...
- 今日头条小程序内测!BAT早已收割,张一鸣还能分到羹吗?
文:罗超,陶程亦有贡献 日前,一位开发者向"罗超频道"透露,其已受邀参加今日头条小程序内测,如果不出意外,今日头条小程序平台很快就会发布. 如果今日头条发布小程序,将是继BAT后, ...
- 字节跳动(今日头条),为何战斗力如此凶猛?
字节跳动(今日头条),为何战斗力如此凶猛? 年前,一位久未联系的朋友问京杭君: 有没有研究过今日头条? 还有没有上升空间? 这位朋友在杭州阿里工作多年,后出来创业,有猎头联系他,今日头条要在杭州成立技 ...
- 2018字节跳动(今日头条那个)一面凉经
2018字节跳动(今日头条那个)一面凉经 >> 注意:图片里面我的输入是有错误的(原谅我略菜) ' 1.CSS垂直居中.水平垂直居中PS:这个高度是宽度的50%没有思路,而且因为没有界面调 ...
- vue仿今日头条_字节跳动今日头条前端面经(4轮技术面+hr面)
笔者读大三,前端小白一枚,正在准备春招,人生第一次面试,投了头条前端,总共经历了四轮技术面试和一轮hr面,不多说,直接上题 一面 自我介绍,然后问了为什么学习前端 算法:实现36进制转换 简述http ...
- 软件测试字节跳动头条项目面试,字节跳动|今日头条面试经验分享
最近一直在找实习,历时1个月,投了无数被拒了无数终于拿到想要的offer了!最近在面腾讯,分享一下字节跳动今日头条的面试经验攒人品啦- P1-5:面试官问的问题 P6:总体感受 (面试问题我放在最后了 ...
- WordPress微信小程序,WordPress百度小程序,WordPressQQ小程序,WordPress今日头条小程序,WordPress抖音小程序,WordPress多端小程序
WordPress微信小程序,WordPress百度小程序,WordPressQQ小程序,WordPress今日头条小程序,WordPress抖音小程序,WordPress多端小程序. WordPre ...
- 快手小店电脑版_微信PC版更新!支持在小程序中使用微信支付 | 一周资讯
小程序1. 微信PC版更新,支持在小程序中使用微信支付.12月19日,微信PC端推出内测版2.7.2.73,新版本支持以下新功能:新增看一看精选内容,新的订阅号浏览体验,支持在小程序中使用微信支付.( ...
- jsapi支付签名_小程序开发之微信支付
1. 小程序之微信支付 虽然我们现行的小程序版本中没有支付这块功能,但是作为移动互联网中非常重要的一个功能还是需要了解下(老版本的小程序中有微信支付相关的功能代码在serviceList.js中). ...
最新文章
- Luence简单实现1
- java 3des 32位密钥_3des,java_java 中32位秘钥长度的 3des加密方法?,3des,java - phpStudy...
- java –cp ./:_成为Java流大师–第3部分:终端操作
- 机器学习实现计算不规则图形面积_《图形编程技术学习》(五十八)用VS实现逐顶点的光照计算...
- pycharm关闭/开启代码补全/代码提示
- php留言板入门教程,一个php留言板实例
- Python读取excel文件数据并画柱状图
- R语言如何释放运行之后的内存?
- 【错误记录】安卓项目编译报错 ( offline mode 错误 )
- 照片模糊怎么办?教你简单三步瞬间修复照片清晰度!
- 普通计算机电缆,计算机电缆和普通电缆有什么区别吗?
- 如何利用网络技术赚钱的
- Win11宽带连接错误651怎么解决?
- Android关系型数据库应用——电话(短信)黑名单
- 李宏毅2022机器学习HW5解析
- mysql创建储存过程 输入学生名子_创建一个存储过程,给定某学生学号,要求查询出该学生的姓名,所选课程名和成绩.(SQL SERVER)...
- 更改tkinter的OptionMenu背景颜色和下拉菜单宽度
- 什么是高可用性_什么是高可用性| 第2部分
- [学习笔记]Min-25筛
- 2018年网上最靠谱的正规赚钱思路
热门文章
- ValueError: Input 0 of node ... was passed float from ... incompatible with expected float_ref.
- 项目管理网络图概念总结
- SMETA验厂咨询,Sedex验厂工厂的自检流程有哪些
- 龙芯电脑上架设网络学习管理系统Moodle
- Towards Characterizing the Behavior of LiDARs in Snowy Conditions
- 如何定向网件路由防火墙与URL
- 个人征信要良好,申请信用卡需注意哪些事项?
- 影创发布首款头手6DoF MR眼镜鸿鹄,搭载高通骁龙XR2平台
- 100部经典中国电影,你看过几部?
- linux怎样安装xz工具,linux xz解压工具