array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 微信APP支付,支付宝APP支付demo - 爱码网
cqingt

最近公司新开发的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 更新订单状态,用户账户余额,账户变化日志
    }
}

分类:

技术点:

相关文章: