技术标签: PHP
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1 【微信支付】APP支付开发者文档
https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103666&docType=1 服务器异步通知参数说明
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.9cVrvO&treeId=204&articleId=105465&docType=1 App支付请求参数说明
第一步先到stripe 官网 https://stripe.com 注册一个账号
然后到 https://pan.baidu.com/s/1eRIVVGm 这个链接里面下载例子(这个文件里只包含支付demo和公共api接口包)
Api 接口地址 :https://stripe.com/docs/api (这个地址可能在谷歌里面打开里面什么都没有,大家可以到火狐或者IE浏览器上看看),api地址里面包含各种有关支付、退款的例子。
退款:退款里面调用的文件在 https://pan.baidu.com/s/1eRIVVGm 这里面
/* * 退款测试 */ public function refund(){ require_once 'public/stripe-php-3.20.0/init.php'; \Stripe\Stripe::setApiKey("sk_test_BQokikJOvBiI2HlWgH4olfQ2"); $re = \Stripe\Refund::create(array( "charge" => "ch_18lF8dEm2C3rQ9STPtScvnth", "amount" => "50", )); echo "<pre>"; var_dump($re);die; }
支付宝官网demo地址:https://b.alipay.com/order/techService.htm
打开连接后在最下面有所有的demo
https://docs.open.alipay.com/api_1/alipay.trade.refund
/* * 订单退款 */ static function wx_tui($order_id,$order){ // 引入微信api require_once "./api/wxpay/lib/WxPay.Api.php"; $input = new \WxPayRefund(); $input->SetTransaction_id($order_id); $input->SetTotal_fee(1); $input->SetRefund_fee(1); $input->SetOut_refund_no(\WxPayConfig::MCHID . date("YmdHis")); $input->SetOp_user_id(\WxPayConfig::MCHID); $result = \WxPayApi::refund($input); // var_dump($result); // F('wxrefund' . setName(), $result); // 更新退款信息 if ($result['return_code'] == "SUCCESS") { $time = time(); // 更新订单状态 M("order")->where("order_id = {$order['order_id']}") ->save(array('refund_price'=>$order['total_price'], 'user_confirm_refund'=>1, 'refund_status_time'=>$time, 'refund_status'=>1, 'pay_status'=>6)); // M("orders")->where(array("trade_no" => $trade))->save($saveData); } }
微信提现的前提需要开启
功能 //微信提现 public function wxtix(){ $date['device_info'] = post("access_token");//微信支付分配的终端设备号 $date['openid'] = post("openid");//商户appid下,某用户的openid $date['amount'] = post("money",1);//企业付款金额,单位为分 $user_id = (int)post("user_id"); ksort($date); $string = $this->ToUrlParams($date); $string = substr(md5('kaimi'.$string."kaimi"),8,16); $secret = post("secret",'');//加密字段 if($string!=$secret){ $this->showCode(-2, array()); } $user_wallet = M("user_wallet")->where("user_id = {$user_id}")->find(); if($user_wallet['wallet_money']<$date['amount']){ $this->showCode(1, array(), '余额不足'); } if(empty($date['device_info'])||empty($date['openid'])||empty($date['amount'])){ $this->showCode(-1, array(), '参数缺少'); } $date['partner_trade_no'] = "ti".time(). rand(10000, 99999);//商户订单号,需保持唯一性 $date['amount'] = $date['amount'] * 100; $time = time(); M("titrade_no")->add(array("user_id"=>$user_id,"type"=>2,"money"=>$date['amount']/100,"trade_no"=>$date['partner_trade_no'],"ctime"=>$time)); $data = $this->wx_tixian($date); if($data['return_code']=='SUCCESS'||$data['result_code']=='SUCCESS'){ M("user_wallet")->where("user_id = {$user_id}")->setDec("wallet_money",$date['amount']/100); $time = time(); M("titrade_no")->where("trade_no = {$data['partner_trade_no']} and user_id = {$user_id}")->save(array('ti_time'=>$time,'status'=>1)); $this->showCode(0, array(), '提现成功'); }else{ $this->showCode(1, array(), '提现失败'); } } /** * @param $date * 生成签名 */ public function sign($date){ //签名步骤一:按字典序排序参数 ksort($date); $string = $this->ToUrlParams($date); //签名步骤二:在string后加入KEY $string = $string . "&key=".\WxPayConfig::KEY; //签名步骤三:MD5加密 $string = md5($string); //签名步骤四:所有字符转为大写 $result = strtoupper($string); return $result; } /** * 格式化参数格式化成url参数 */ public function ToUrlParams($date) { $buff = ""; foreach ($date as $k => $v) { if($k != "sign" && $v != "" && !is_array($v)){ $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; } //生成XML function xml($arr){ $str = "<xml>"; foreach($arr as $k=>$v){ $str .= "<{$k}>{$v}</{$k}>"; } $str .= "</xml>"; return $str; } /* * 微信提现 */ public function wx_tixian($data){ header("Content-type: text/html; charset=utf-8"); // 引入微信api require_once "./api/wxpay/lib/WxPay.Api.php"; $date['mch_appid'] = \WxPayConfig::APPID;//微信分配的公众账号ID(企业号corpid即为此appId) $date['mchid'] = \WxPayConfig::MCHID; //微信支付分配的商户号 $date['nonce_str'] = 'kaimi' .time(). rand(10000, 99999); //随机字符串,不长于32位 $date['partner_trade_no'] = "ti".time(). rand(10000, 99999);//商户订单号,需保持唯一性 /** * NO_CHECK:不校验真实姓名 *FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) *OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功) */ $date['check_name'] = "NO_CHECK"; $date['re_user_name'] = ""; //收款用户真实姓名。 如果check_name设置为FORCE_CHECK或OPTION_CHECK,则必填用户真实姓名 $date['desc'] = "提现"; //企业付款操作说明信息。必填。 $date['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"]; //调用接口的机器Ip地址 $date['sign'] = $this->sign($date); //签名 $data = $this->xml($date); $ch = curl_init(); $MENU_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; curl_setopt($ch, CURLOPT_URL, $MENU_URL); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $zs1 = \WxPayConfig::getSSLcertPath(); $zs2 = \WxPayConfig::getSSLKeyPath(); curl_setopt($ch, CURLOPT_SSLCERT, $zs1); curl_setopt($ch, CURLOPT_SSLKEY, $zs2); // curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; // Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $info = curl_exec($ch); if (curl_errno($ch)) { echo 'Errno' . curl_error($ch); } curl_close($ch); $data = \WxPayResults::Init($info); return $data; } 微信官网接口地址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
/**
* 帮我买下单 微信支付
*/
public function weipay(){
$order_id = I("order_id");
$money = I("money");
if($order_id == '' || $money == ''){
$this->json("100090","缺少参数");
}
require_once "./public/weipay/lib/WxPay.Api.php";
require_once "./public/weipay/example/log.php";
require_once "./public/weipay/lib/WxPay.Config.php";
$ordrTitle = "电达人订单支付";
// 准备参数
$notify_url = $_SERVER['HTTP_HOST']."/index.php/api/orders/order_callback_weipay";
// 统一下单
$input = new \WxPayUnifiedOrder();
$input->SetBody($ordrTitle);
$input->SetAttach($ordrTitle);
$input->SetOut_trade_no($order_id);
$input->SetTotal_fee($money * 100);
$input->SetTime_start(date("YmdHis"));
$input->SetNotify_url($notify_url);
$input->SetTrade_type("APP");
$input->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip
$order = \WxPayApi::unifiedOrder($input);
//dump($order);die;
if ($order['return_code'] == 'SUCCESS')
{
$wxvalue = array();
$wxvalue['appid'] = $order['appid'];
$wxvalue['prepayid'] = $order['prepay_id'];
$wxvalue['partnerid'] = $order['mch_id'];
$wxvalue['package'] = 'Sign=WXPay';
$wxvalue['timestamp'] = time();
$wxvalue['noncestr'] = \WxPayApi::getNonceStr();
ksort($wxvalue); // 排序
$wxstr = $this->ToUrlParams($wxvalue);
$string = $wxstr . "&key=" . \WxPayConfig::KEY;
// 签名步骤三:MD5加密
$md5string = md5($string);
$wxvalue['sign'] = strtoupper($md5string);
$wxvalue['title'] = $ordrTitle;
$new = $wxvalue;
$new['order_id'] = $order_id;
//dump($new);die;
$this->json('10001',$new);
// json("10001", $wxvalue);
}else{
$this->json('405', '支付生成失败,请联系我们');
}
}
/**
* 微信支付回调
*/
public function order_callback_weipay(){
$arr = $_POST;
if (empty($arr))
{
$xml = file_get_contents('php://input');
$arr = $this->FromXml($xml);
}
if (array_key_exists('openid', $arr))
{
if($arr['result_code']=="SUCCESS"){
$orderid = $arr['out_trade_no'];
$stas = M("order")->where("order_id='$orderid'")->field("statics")->find();
$static = $stas["statics"];
if($static == 2){
$da["statics"] = 3;
$da["is_zhi"] = 1;
} else {
$da["statics"] = 9;
$da["is_zhi"] = 2;
}
M("order")->where("order_id = {$arr['out_trade_no']}")->save($da);
}
//$info = json_decode($arr,true);
// M("weixin")->add($arr);
//echo '<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>';
echo "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
}
}
/**
* 拼接key=>$value
* @access public
*/
protected function ToUrlParams ($wxarr)
{
$buff = "";
foreach ($wxarr as $k => $v)
{
if ($k != "sign" && $v != "" && ! is_array($v))
{
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
/**
* xml数据转array
* @param unknown $xml
* @throws WxPayException
* @return mixed
*/
protected function FromXml ($xml)
{
if (! $xml)
{
return;
}
// 将XML转为array
// 禁止引用外部xml实体
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $data;
}
微信官网demo地址 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
//支付宝
require_once "./public/alipay/lib/alipay_core.function.php";
require_once "./public/alipay/lib/alipay_rsa.function.php";
$data['notify_url'] = "http://".$_SERVER['HTTP_HOST'].'/index.php/Api/Orders/order_callback_alipay1';
$data['app_id'] = '2016112203112986';//Appid
$data['method'] = 'alipay.trade.app.pay';
$data['charset'] = 'utf-8';
$data['sign_type'] = 'RSA';
$data['timestamp'] = date("Y-m-d H:i:s");
$data['version'] = '1.0';
$data['timeout_express'] = '30m';
$data['biz_content'] = "{'seller_id':'2088521328498118','total_amount':$money,'subject':'电达人订单支付','body':'电达人','out_trade_no':'".$sheng_order."','product_code':'QUICK_MSECURITY_PAY'}";
$mygoods = argSort($data);
//拼接
$mystr = createLinkstring($mygoods);
//签名
$p = 'MIICXQIBAAKBgQDIQlDqpQXj1I2fNvGV5jEoslU2JXLhp8F0/ST9r07dip6cUBhD
03hfgm0kUZRzhTazRhK1HctvgIfBQ3aK2qKtYnSsBmXeqn5Om4CXdacbhLo17Iw+
z86i9xTo9htlWEmoSUjB49bFuZ29EW7UFO387LGHryW2WGNieI2+MrNVVwIDAQAB
AoGAKoaSolFq38e6T04enUNluwurtrTbIXo7RbmgClMY/0i5h94mWPjmPfn3bVf5
m1J1nDpMLLPoCISVz3+hA7mMA79xgL+PAvLmWnkPYHIo6rucG5BFhPLQo5z+w8J+
+e4Ri9e/I6yEOfUWAQnr74T1qmGxRihDcMHu07BE4f2EWKECQQDuq/odOY5onwSt
I7g0ojEz/0wz9X7nGIyUqmK+JwFchQARqOQQoAY1ngiCgY1co9HRmU7PdbLTi0Z8
ExNDlsgxAkEA1sxjh5Mq75ryA9BYWvL7fIM6k9Wn3GT1aMrJ41yppMVECLMi8Mat
r3KwT3vYku0x58La1G/2eFydIlfvAXacBwJBAOMDsWMa29mnZ0tILm3h1+sdad4C
JDKrpwvBBSrY7vKRjv89JbCqhT16k52OnGcBaxFyQQQTb4THdMOPYUNoqAECQAYN
tpRgkmo0TLPM0GCnzmyg6iq2b8enVL9CT9RHjURmhtdT7R0qDEUQj2V+EQl7A9gL
Rs2L5j9YJNmN7t90r0sCQQDECDHvrl6eSZMF1ZrLbGT9XdsfAkGuMt3yHVu8FU5/
fVEjJCF3e56F1qS6Hj41Kr371FhAXTW5uroAGEa07n4Z'; //
$sign = rsaSign($mystr,$p);
//对签名进行urlencode转码
$sign = urlencode($sign);
$data1['sign'] = $sign;
$orderInfor = $mystr."&sign=".$sign;
$this->json('10001',$orderInfor);
/*
*支付宝支付 回调函数
*/
if (array_key_exists('buyer_id', $arr)) //支付宝 回调函数
{
require_once "./public/alipay/alipay.config.php";
require_once "./public/alipay/lib/alipay_notify.class.php";
require_once "./public/alipay/lib/alipay_rsa.function.php";
require_once "./public/alipay/lib/alipay_core.function.php";
//计算得出通知验证结果
$alipayNotify = new \AlipayNotify($alipay_config);
if($alipayNotify->getResponse($_POST['notify_id'])) { //判断成功之后使用getResponse方法判断是否是支付宝发来的异步通知。
if($alipayNotify->getSignVeryfy($_POST, $_POST['sign'])) { //使用支付宝公钥验签
if($_POST['trade_status'] == 'TRADE_FINISHED') {
}
if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
$da2["ding"] = $arr['total_amount']; //total_fee
$da2["is_zhi"] = 1;//支付状态 支付定金
$da2["statics"] = 3;//订单状态 支付定金
$da2["zhi_type"] = 2;//支付方式 支付定金 2 支付宝
$order_id = $arr['out_trade_no'];
M("order")->where("ding_order ='$order_id'")->save($da2);
// $d = M("order")->getLastSql();
// $arr['c_name'] = $d;
// M("ceshi")->add($arr);
$d = json_encode($arr);
$ard['c_name'] = $d;
M("ceshi")->add($ard);
}
M("zhifubao")->add($arr);
echo "success"; //请不要修改或删除
}else //验证签名失败
{
// $arr['c_name'] = '4';
// M("ceshi")->add($arr);
// logResult('验证签名失败11');
echo "sign fail";
}
}else //验证是否来自支付宝的通知失败
{
// $arr['c_name'] = '2';
// M("ceshi")->add($arr);
// logResult('验证失败22');
echo "response fail";
}
}
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数