微信APP支付,支付宝APP支付demo
最近公司新开发的APP中,需要集成微信支付和支付宝支付,2个平台申请的都是APP支付。这是个人第一次单独的,完整的做完2个平台的支付。
这里我主要用到了2个接口:支付接口,订单查询接口,虽然2个平台的文档都挺齐全,但开发下来,还是踩了不少坑,记录下来,或许对后来人有用。
先来说支付宝SDK:
了解3个概念:应用公钥,应用私钥和支付宝公钥
开发人员用支付宝提供的秘钥生成工具生成的秘钥,即为应用公钥和应用私钥。
开发人员在给支付宝APP配置应用公钥后,支付宝主动生成了一个公钥,即为支付宝公钥。
配置如下图示:

需要把这个支付宝公钥保存下来,具体使用场景,请看后续说明。
这里个人用到了2个接口,生成支付订单信息和订单查询。
支付宝提供了服务端SDK的下载:https://docs.open.alipay.com/54/106370/
其目录显示:

下面直接给出支付、回调、订单查询的代码:
// 生成支付信息
function pay() {
$aop = new AopClient;
$aop->gatewayUrl = '网关地址';
$aop->appId = 'alipay_appid';
$aop->rsaPrivateKey = '应用私钥';
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = '支付宝公钥'; $request = new AlipayTradeAppPayRequest(); $bizcontent = "{\"body\":\"账户充值\","
. "\"subject\": \"用户账户充值\","
. "\"out_trade_no\": \"订单号\","
. "\"timeout_express\": \"30m\","
. "\"total_amount\": \"订单金额\","
. "\"product_code\":\"QUICK_MSECURITY_PAY\""
. "}";
$request->setNotifyUrl('开发者回调地址');
$request->setBizContent($bizcontent);
$response = $aop->sdkExecute($request); // 注意: 官方demo里,这里加了htmlspecialchars方法,其实是错误的,应该去掉,否则会报ALI38173错误
echo $response;
} // 回调
function callback() {
$aop = new AopClient ();
$aop->alipayrsaPublicKey = '支付宝公钥'; // 支付宝回调是以POST方式提交过来的
$result = $aop->rsaCheckV1($_POST, null, $_POST['sign_type']); if ($result) {
// TODO 验证订单号,支付金额,支付宝状态等信息
echo 'success';
} else {
echo 'error';
}
} // 订单查询
function queryOrder() {
$aop = new AopClient ();
$aop->signType = "RSA2";
$aop->gatewayUrl = '网关地址';
$aop->appId = 'appid';
$aop->rsaPrivateKey = '应用私钥'; // 注意:这里是支付宝公钥,不是应用公钥
$aop->alipayrsaPublicKey = '支付宝公钥'; $request = new AlipayTradeQueryRequest ();
$request->setBizContent("{" .
"\"out_trade_no\":\"订单号\"," .
"\"trade_no\":\"交易单号\"" .
"}");
$result = $aop->execute($request); $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code; if(! empty($resultCode) && $resultCode == 10000) {
if ($result->$responseNode->trade_status == 'TRADE_SUCCESS') {
// 支付成功, 更新订单状态,用户账户余额,账户变化日志
}
}
}
微信支付:
在开发平台申请app支付:https://open.weixin.qq.com/
审核通过后,需要配置开发信息

服务端PHP的demo:
// 生成支付信息
function pay() {
$input = new WxPayUnifiedOrder();
$input->SetBody('支付标题');
$input->SetAttach('附加信息'); // 附加信息
$input->SetOut_trade_no('订单号');
$input->SetTotal_fee('订单金额,单位分'); //微信支付,单位(分)
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag('附属信息');
$input->SetNotify_url('回调地址');
$input->SetTrade_type("APP"); // 生成预支付订单ID:prepay_id
$unifiedOrder = WxPayApi::unifiedOrder($input); // 生成签名,返回给APP前端调用
$result = makeWxPaySign($unifiedOrder);
} // 生成签名
function makeWxPaySign($UnifiedOrderResult)
{
if(! array_key_exists("appid", $UnifiedOrderResult)
|| ! array_key_exists("prepay_id", $UnifiedOrderResult)
|| empty($UnifiedOrderResult['prepay_id']))
{
throw new WxPayException("参数错误");
} $api = new WxPayAppPay();
$api->SetValue('appid', $UnifiedOrderResult["appid"]);
$api->SetValue('package', "Sign=WXPay");
$api->SetValue('prepayid', $UnifiedOrderResult['prepay_id']); // 预支付订单号
$api->SetValue('partnerid', WxPayConfig::MCHID); // 商户号
$api->SetValue('noncestr', WxPayApi::getNonceStr()); // 随机数
$api->SetValue('timestamp', (string)time()); // 对上面参数进行签名
$api->SetValue('sign', $api->MakeSign()); return $api->GetValues();
} // 回调,继承微信SDK的回调类
class PayNotifyCallBack extends WxPayNotify
{
//重写回调处理函数
public function NotifyProcess($data, &$msg)
{
if (! array_key_exists("transaction_id", $data)) {
return false;
} // 调用订单查询方法,判断订单真实性 return true;
}
} // 订单查询
function queryOrder() {
$input = new WxPayOrderQuery(); $input->SetTransaction_id('支付平台交易号');
$input->SetOut_trade_no('公司平台单号'); // 订单查询结果
$result = WxPayApi::orderQuery($input); if(array_key_exists("return_code", $result)
&& array_key_exists("result_code", $result)
&& array_key_exists('trade_state', $result)
&& $result["return_code"] == "SUCCESS"
&& $result["result_code"] == "SUCCESS"
&& $result["trade_state"] == "SUCCESS")
{
// 交易成功,todo 更新订单状态,用户账户余额,账户变化日志
}
}
微信APP支付,支付宝APP支付demo的更多相关文章
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- App对接支付宝移动支付功能
前段时间看了下app对接支付宝移动支付的功能,并自己总结了下支付宝移动支付的实现流程 一.申请流程 前提是已有现成的应用. 1. 申请地址 https://b ...
- android app 集成 支付宝支付 微信支付
项目中部分功能点需要用到支付功能,移动端主要集成支付宝支付和微信支付 支付宝sdk以及demo下载地址:https://doc.open.alipay.com/doc2/detail.htm?spm= ...
- 微信、支付宝App支付-JPay0.0.2发布
JPay 对微信App支付.支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调 GitHub:https://github.com/Javen205/JPay OsChina:h ...
- php支付走过的坑(微信篇 包含h5支付和app支付 注册 秘钥 环境等等配置)
支付这东西,说容易也容易,说难也难 代码这玩意还比较好说 但是 如果没有demo 直接去看官方文档 十有八九一脸懵逼 今天就整理一下 支付这块走过的坑 涉及 微信h5支付 支付宝h5支付 (api文档 ...
- php微信jsapi支付 支付宝支付 两码合一
产品开会提出了这样的需求:一个二维码可以微信支付也可以支付宝支付 经过自己的钻研以及询问技术高人(本人代码一般般)和网上搜索 最终实现其功能 我用微信jsapi 和 支付宝网页支付 其实并不怎么难: ...
- wap站、手机APP 接入支付宝、微信、银联支付。
一.wap站 ①.支付宝接入 1.开发前准备:申请一个通过实名认证的企业支付宝账号,并申请开通手机WAP支付功能. 2.流程 参数准备: 企业支付宝账号的PID(也叫ParnerID)和KEY,如果使 ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- Android版-支付宝APP支付
此项目已开源 赶快来围观 Start支持下吧 [客户端开源地址-JPay][服务端端开源地址-在com.javen.alipay 包名下] 上一篇详细介绍了微信APP支付 点击这里 此篇文章来详细介绍 ...
随机推荐
- postma概念与使用
Postman是google开发的一款功能强大的网页调试与发送网页HTTP请求,并能运行测试用例的的Chrome插件.Postman作为一个chrome的插件,你可以打开chrome,在chrome ...
- ubuntu 18.04配置静态ip,解决无法上网问题,解决resolv.conf配置文件被覆盖
Netplan 是 Ubuntu 17.10 中引入的一种新的命令行网络配置实用程序,用于在 Ubuntu 系统中轻松管理和配置网络设置. 它允许您使用 YAML 格式的描述文件来抽像化定义网络接口的 ...
- Python脚本字符集问题
运行脚本的时候,总是报错: SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xb9 in position 0: inval ...
- Python爬虫学习--用Python结合Selenium实现 明日之子节目直播时为自己喜欢的选手自动点赞拉票!!!
声明:本脚本纯属娱乐,请勿用来非法点赞拉票,任何使用不当造成的后果自行承担. 闲话: 明日之子第二季开始好久了,作者一直再追,特别喜欢里面那个酷酷的小哥-蔡泽明.前两天晋选9大厂牌,采取的是直播的形式 ...
- node.js 使用 superagent 与 cheerio 完成简单爬虫
目标 建立一个 lesson3 项目,在其中编写代码. 当在浏览器中访问 http://localhost:3000/ 时,输出 CNode(https://cnodejs.org/ ) 社区首页的所 ...
- su与su -的区别
su命令从普通用户切换到root用户下虽然可以切换,但是切换过后它所属的环境变量没有切换回原本属于root本身该有的环境变量,使用su - root 就可以切换会本来用户所属自身的变量
- web安全系列2:http初探
web安全系列的第二篇 首先,我们先来理解两个名词C/S架构和B/S架构. 所谓C/S架构,就是客户机/服务器架构,而B/S架构就是浏览器/服务器架构.C/S是通常的桌面程序的架构方式,而B/S就是网 ...
- 使用electron开发指静脉客户端遇到的问题总结
使用electron 使用nodejs 的ffi模块调用dll文件 总结1.electron 与nodejs版本不需要一致,甚至nodejs版本应该高于electron的node版本2.要安装 Vis ...
- 解决Chrome 70及以上版本的证书问题:Failed to load resource: net::ERR_CERT_SYMANTEC_LEGACY
1.桌面必须要有Chrome 快捷方式 2.进入快捷方式属性 3.修改目标为:"C:\Program Files (x86)\Google\Chrome\Application\chrome ...
- python中使用XPath
XPath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线. XPath介绍: ...