发布时间:2022-12-04 14:19:43 文章来源:互联网
微博 微信 QQ空间

支付宝手机网站支付服务端SDK部分官方DEMO来实现支付

想必很多人都有过微信公众号用支付宝支付的经历,但是微信把阿里系统里的东西都屏蔽了。网上百度了很多,都没有完整的解决办法。刚刚踩坑的袁晓薇就迫不及待的分享给大家了。

切入点,其实支付宝官方已经给出了在微信公众号使用支付宝支付的解决方案【微信公众平台无法使用支付宝收付的解决方案】。有DEMO可供下载参考。于是,袁晓薇基于官方提供的DEMO实现了微信公众号的支付宝支付。

调用支付宝手机网站支付服务器SDK部分,可以下载官方DEMO实现【各语言服务器SDK】,首先在支付配置文件config.php配置自己的参数,然后创建一个支付类:alipayMobile.class。 php,调用手机网站支付接口,废话少说,直接上传代码:

类支付宝手机

{

/**

* 生成支付码

* @param array $$order 订单信息

* @param array $$bodys 订单名称,描述

*/

函数 get_code($$order,$$bodys)

{

require_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'wappay/service/AlipayTradeService.php';

require_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'wappay/buildermodel/AlipayTradeWapPayContentBuilder.php';

需要目录名 ( __FILE__ ).DIRECTORY_SEPARATOR.'./config.php';

//商户订单号,商户网站订单系统中唯一的订单号,必填

$$out_trade_no = $$order['order_sn'];

//订单名称,必填

$$subject = urlencode($$body);

//支付金额,必填

$$total_amount = $$order['order_amount'];

//商品描述,为空

$$body = urlencode($$bodys);

//超时时间

$$timeout_express="1m";

$$payRequestBuilder = new AlipayTradeWapPayContentBuilder();

$$payRequestBuilder->setBody($$body);

$$payRequestBuilder->setSubject($$subject);

$$payRequestBuilder->setOutTradeNo($$out_trade_no);

$$payRequestBuilder->setTotalAmount($$total_amount);

$$payRequestBuilder->setTimeExpress($$timeout_express);

$$payResponse = new AlipayTradeService($$config);

$$result=$$payResponse->wapPay($$payRequestBuilder, $$config['return_url'], $$config['notify_url']);

返回 $$ 结果;

}

}

注意:这里有一个陷阱需要注意。在官方SDK的wappay/service/AlipayTradeService.php的aopclientRequestExecute方法中,有一个echo $$result操作。该操作调用支付接口后直接跳转到支付宝支付页面。,这是我们微信公众号支付宝支付的一大坑(亲测),一定要注释掉这行代码!

然后是支付请求getPay方法(这里去掉了接口验证等一系列代码逻辑分享):

公共函数 getPay(){

//1。导入付款文件

include_once "plugins/Payment/alipay/alipayMobile.class.php";

$$payment = new \alipayMobile();

$$order_id = I('order_id');

//2。判断参数是否为空

如果(!空($$order_id)){

//3。根据订单id查询订单是否存在

$$order = M('Order')->where(array('id'=>$$order_id))->find();

if ($$order){//订单存在

//4。判断订单是否已支付,若已支付,返回支付失败并给出相应提示

如果($$order['pay_status'] == '1'){

exit(json_encode(array('status'=>'205','msg'=>'订单已支付,请勿再次提交!')));

}

$$bodys = 'Order:'.$$order['order_sn'] . '支付';

//5。调用支付类中封装的支付方法,并传递相应的参数

$$result = $$payment->get_code($$order,$$body);

//6。将result中的参数返回给前端

exit(json_encode(array('status'=>'0','msg'=>'操作成功','result'=>$$result)));

}别的{

// 错误:数据不存在

exit(json_encode(array('status'=>'-200','msg'=>'订单不存在,提交前请验证!')));

}

}别的{

// 错误:缺少参数

exit(json_encode(array('status'=>'-204','msg'=>'参数缺失,请验证!')));

}

}

好了,接下来就是本次分享的重点了。前端收到返回的数据后,需要做一些小的处理。这里刚刚下载的官方解决方案DEMO应该可以运行:

首先在页面中导入js文件:ap.js;

其次公众号调起支付宝,将pay.htm文件放到工程目录下(在文件中引入ap.js文件的路径确认是否正确,最后执行_AP.decode返回错误pay.htm#error to write pay .htm 访问url,如:#error);

然后,在支付请求成功后处理接收到的数据:

//接收支付请求成功后返回的数据

var datas = data.result;

//拦截,去掉后面脚本中自动提交表单的部分代码,插入到页面中

$$("#paywindow").append(datas.split('')[0]);

//开始拼接url参数

var 查询参数 = '';

Array.prototype.slice.call(document.querySelectorAll("input[type=hidden]")).forEach(function (ele) {

queryParam += ele.name + "=" + encodeURIComponent(ele.value) + '&';

});

var gotoUrl = document.querySelector("#alipaysubmit").getAttribute('action')+'&'+queryParam;

//调用ap.js方法

_AP.pay(gotoUrl);

注意:支付发起页面和pay.htm页面必须引入ap.js并保证路径正确,否则不成功。

至此,我们就可以愉快的在微信公众号中使用支付宝进行支付了。

催缴费

浏览器唤醒支付宝

确认付款

嗯,一点菜鸟经验,如有不妥之处公众号调起支付宝,欢迎留言作证交流,共同成长,喵,就这样!

另一视角

换一换