学习内容:
https://www.kancloud.cn/tpshop/thinkphp5/272877
Tpshop源码下载地址: http://www.tp-shop.cn/Index/Index/download.html
支付宝对接你的网站完成支付
https://www.alipay.com/
初步简单的理解支付对接流程
下面,我们购买一些商品,下一个订单。
手动修改金额用于测试:
==
==
支付宝:
手机网站支付快速接入
https://docs.open.alipay.com/203/105285
![这里写图片描述](http://img.blog.csdn.net/20170812163604810?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGhwZXI4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
看到form提交的网址,下面看Payment类的getCode
class Payment extends Base {
public $payment; // 具体的支付类
public $pay_code; // 具体的支付code
/**
* 析构流函数
*/
public function __construct() {
parent::__construct();
// tpshop 订单支付提交
$pay_radio = $_REQUEST['pay_radio'];
if(!empty($pay_radio))
{
$pay_radio = parse_url_param($pay_radio);
$this->pay_code = $pay_radio['pay_code']; // 支付 code
}
else // 第三方 支付商返回
{
//file_put_contents('./a.html',$_GET,FILE_APPEND);
$this->pay_code = I('get.pay_code');
unset($_GET['pay_code']); // 用完之后删除, 以免进入签名判断里面去 导致错误
}
//获取通知的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
if(empty($this->pay_code))
exit('pay_code 不能为空');
// 导入具体的支付类文件
include_once "plugins/payment/{$this->pay_code}/{$this->pay_code}.class.php"; // D:\wamp\www\svn_tpshop\www\plugins\payment\alipay\alipayPayment.class.php
$code = '\\'.$this->pay_code; // \alipay
$this->payment = new $code();
}
...
/**
* tpshop 提交支付方式
*/
public function getCode(){
//C('TOKEN_ON',false); // 关闭 TOKEN_ON
header("Content-type:text/html;charset=utf-8");
$order_id = I('order_id/d'); // 订单id
session('order_id',$order_id); // 最近支付的一笔订单 id
// 修改订单的支付方式
$payment_arr = M('Plugin')->where("`type` = 'payment'")->getField("code,name");
M('order')->where("order_id",$order_id)->save(array('pay_code'=>$this->pay_code,'pay_name'=>$payment_arr[$this->pay_code]));
$order = M('order')->where("order_id", $order_id)->find();
if($order['pay_status'] == 1){
$this->error('此订单,已完成支付!');
}
// tpshop 订单支付提交
$pay_radio = $_REQUEST['pay_radio'];
$config_value = parse_url_param($pay_radio); // 类似于 pay_code=alipay&bank_code=CCB-DEBIT 参数
//微信JS支付
if($this->pay_code == 'weixin' && $_SESSION['openid'] && strstr($_SERVER['HTTP_USER_AGENT'],'MicroMessenger')){
$code_str = $this->payment->getJSAPI($order,$config_value);
exit($code_str);
}else{
$code_str = $this->payment->get_code($order,$config_value);
}
$this->assign('code_str', $code_str);
$this->assign('order_id', $order_id);
return $this->fetch('payment'); // 分跳转 和不 跳转
}
再看:
codestr=
this->payment->get_code(
order,
config_value);
/**
* 生成支付代码
* @param array $order 订单信息
* @param array $config_value 支付方式信息
*/
function get_code($order, $config_value)
{
// 接口类型
$service = array(
1 => 'create_partner_trade_by_buyer', //使用担保交易接口
2 => 'create_direct_pay_by_user', //使用即时到帐交易接口
);
//构造要请求的参数数组,无需改动
$parameter = array(
"service" => $service[$this->alipay_config['alipay_pay_method']], // 1 使用担保交易接口 2 使用即时到帐交易接口
"partner" => trim($this->alipay_config['partner']),
"seller_email" => trim($this->alipay_config['seller_email']),
"payment_type" => 1, // 默认值为:1(商品购买)。
"notify_url" => SITE_URL.U('Payment/notifyUrl',array('pay_code'=>'alipay')) , //服务器异步通知页面路径 //必填,不能修改
"return_url" => SITE_URL.U('Payment/returnUrl',array('pay_code'=>'alipay')), //页面跳转同步通知页面路径
"out_trade_no" => $order['order_sn'], //商户订单号
"subject" => 'TPshop 商城', //订单名称 可以中文
"total_fee" => $order['order_amount'], //付款金额
"_input_charset"=> trim(strtolower($this->alipay_config['input_charset'])) //字符编码格式 目前支持 gbk 或 utf-8
);
// 如果是支付宝网银支付
if(!empty($config_value['bank_code']))
{
$parameter["paymethod"] = 'bankPay'; // 若要使用纯网关,取值必须是bankPay(网银支付)。如果不设置,默认为directPay(余额支付)。
$parameter["defaultbank"] = $config_value['bank_code'];
$parameter["service"] = 'create_direct_pay_by_user';
}
//建立请求
require_once("lib/alipay_submit.class.php");
$alipaySubmit = new AlipaySubmit($this->alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
return $html_text;
}
再看:
/**
* 建立请求,以表单HTML形式构造(默认)
* @param $para_temp 请求参数数组
* @param $method 提交方式。两个值可选:post、get
* @param $button_name 确认按钮显示文字
* @return 提交表单HTML文本
*/
function buildRequestForm($para_temp, $method, $button_name) {
//待请求参数数组
$para = $this->buildRequestPara($para_temp);
$sHtml = "<form style='display:none' id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>";
while (list ($key, $val) = each ($para)) {
$sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
}
//submit按钮控件请不要含有name属性
$sHtml = $sHtml."<input type='submit' value='".$button_name."'></form>";
$sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
return $sHtml;
}
然后回到getCode
看跳转到’payment’页面。
里面有:
<script type="text/javascript">
/**
* 检查订单状态
*/
function ajax_check_pay_status() {
$.ajax({
type: "post",
url: "{:U('Home/Api/check_order_pay_status')}",
data: {master_order_id: "{$master_order_sn}", order_id: "{$order_id}"},
dataType: 'json',
success: function (data) {
if (data.status == 1) {
clearInterval(interval);
alert(interval);
location.href = "{:U('Home/Cart/cart4',array('order_id'=>$order_id,'master_order_sn'=>$master_order_sn))}";
}
}
});
}
var interval = setInterval(ajax_check_pay_status, 5000);
</script>
意思是每5秒检查一下支付状态。
但看代码,Home/Api/check_order_pay_status,Home下没有Api
可能是没有开源。
就了解到此吧。
==编程是一种美德,是促使一个人不断向上发展的一种原动力==