后端开发 \ PHP \ Tpshop学习(7)-支付宝支付集成

Tpshop学习(7)-支付宝支付集成

总点击342
简介:学习内容: https://www.kancloud.cn/tpshop/thinkphp5/272877 Tpshop源码下载地址:http://www.tp-shop.cn/Index/Index/download.html

学习内容:


https://www.kancloud.cn/tpshop/thinkphp5/272877

Tpshop源码下载地址: http://www.tp-shop.cn/Index/Index/download.html

Tpshop学习(7)-支付宝支付集成

支付宝对接你的网站完成支付

https://www.alipay.com/

Tpshop学习(7)-支付宝支付集成

初步简单的理解支付对接流程

Tpshop学习(7)-支付宝支付集成

下面,我们购买一些商品,下一个订单。


手动修改金额用于测试:


==


==

支付宝:

手机网站支付快速接入

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:wampwwwsvn_tpshopwwwpluginspaymentalipayalipayPayment.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',//页面跳转同步通知页面路径

"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 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


可能是没有开源。

就了解到此吧。

==编程是一种美德,是促使一个人不断向上发展的一种原动力==

意见反馈 常见问题 官方微信 返回顶部