zoukankan      html  css  js  c++  java
  • 微信支付开发(2) 静态链接Native支付

    关键字:微信支付 微信支付v3 native支付 统一支付 Native支付 prepay_id 
    作者:方倍工作室
    原文: http://www.cnblogs.com/txw1958/p/wxpayv3-native-static.html

    本文介绍微信支付下的基于静态链接二维码的Native支付实现流程。

    注意

    微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版。V3版的微信支付没有paySignKey参数。v2的相关介绍请参考方倍工作室的其他文章。本文介绍的为微信支付v3。

    一、静态链接二维码生成

    静态链接二维码的生成过程中,核心是sign签名。下面介绍sign签名过程。

    1. 参数准备

    唯一要确定的参数是产品的ID号。其他的是支付参数或者由程序生成。程序生成的部分如下。

    $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
    $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
    $time_stamp = time();
    $this->parameters["time_stamp"] = "$time_stamp";//时间戳
    $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串

    产品ID号可以临时这样生成的。

    $product_id = WxPayConf_pub::APPID."static";//自定义商品id
    $nativeLink->setParameter("product_id","$product_id");//商品id

    生成后,数组如下:

    复制代码
    object(NativeLink_pub)[1]
      public 'parameters' => 
        array (size=5)
          'product_id' => string 'wxdbfd43c561acxxxxstatic' (length=24)
          'appid' => string 'wxdbfd43c561acxxxx' (length=18)
          'mch_id' => string '10012345' (length=8)
          'time_stamp' => string '1419733441' (length=10)
          'nonce_str' => string 'no6qegpf11rn13nyl2q9izsk60be7fxc' (length=32)
    复制代码

    2. 签名生成

    1) 将传入参数进行字典序排序,排序后结果如下:

    复制代码
    array (size=5)
      'appid' => string 'wxdbfd43c561acxxxx' (length=18)
      'mch_id' => string '10012345' (length=8)
      'nonce_str' => string 'no6qegpf11rn13nyl2q9izsk60be7fxc' (length=32)
      'product_id' => string 'wxdbfd43c561acxxxxstatic' (length=24)
      'time_stamp' => string '1419733441' (length=10)
    复制代码

    2) 生成URL键值对,生成如下:

    appid=wxdbfd43c561acxxxx&mch_id=10012345&nonce_str=no6qegpf11rn13nyl2q9izsk60be7fxc&product_id=wxdbfd43c561acxxxxstatic&time_stamp=1419733441

    3) 拼接key,得到新字符串如下:

    appid=wxdbfd43c561acxxxx&mch_id=10012345&nonce_str=no6qegpf11rn13nyl2q9izsk60be7fxc&product_id=wxdbfd43c561acxxxxstatic&time_stamp=1419733441&key=abcdefg123456789abcdefg123456789

    4) 将新字符串进行md5运算,结果如下

    546cd81b0b66f57dc27bfeecea1fb218

    5) 签名结果进行大写,结果如下:

    546CD81B0B66F57DC27BFEECEA1FB218

    至此,成功得到签名。下面可以构造url

    3. 签名生成

    静态Native支付的链接格式如下

    weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX

    其中 XXXXX 为商户需要填写的内容,将该链接生成二维码,如需要打印发布静态的二维码,采用此格式。

    上一步中,生成的所有参数如下所示:

    复制代码
    object(NativeLink_pub)[1]
      public 'parameters' => 
        array (size=6)
          'product_id' => string 'wxdbfd43c561acxxxxstatic' (length=24)
          'appid' => string 'wxdbfd43c561acxxxx' (length=18)
          'mch_id' => string '10012345' (length=8)
          'time_stamp' => string '1419733441' (length=10)
          'nonce_str' => string 'no6qegpf11rn13nyl2q9izsk60be7fxc' (length=32)
          'sign' => string '546CD81B0B66F57DC27BFEECEA1FB218' (length=32)
    复制代码

    通过下述函数得到二维码链接地址

    //获取链接
    $product_url = $nativeLink->getUrl();

    构造最终的链接如下所示:

    weixin://wxpay/bizpayurl?appid=wxdbfd43c561acxxxx&mch_id=10012345&nonce_str=no6qegpf11rn13nyl2q9izsk60be7fxc&product_id=wxdbfd43c561acxxxxstatic&sign=546CD81B0B66F57DC27BFEECEA1FB218&time_stamp=1419733441

    二、请求获取商品信息

    1. 参数准备接收XML通知

    微信支付配置中,需要配置Native原生支付回调URL
    该回调URL将在扫描二维码时发起支付请求,请求将收到扫描静态Native支付链接的通知,接收通知的代码如下:

    //使用native通知接口
    $nativeCall = new NativeCall_pub();
    //接收微信请求
    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];

    接到到的xml通知格式如下

    复制代码
    <xml>
        <appid><![CDATA[wxdbfd43c561acxxxx]]></appid>
        <openid><![CDATA[oc-XIjh32OByBiak_gSZ6JOqGFx8]]></openid>
        <mch_id><![CDATA[10012345]]></mch_id>
        <is_subscribe><![CDATA[Y]]></is_subscribe>
        <nonce_str><![CDATA[PvLH3nsJjQCvwnYY]]></nonce_str>
        <product_id><![CDATA[wxdbfd43c561acxxxxstatic]]></product_id>
        <sign><![CDATA[F1CBDE07E3B5AE6EAF4D4033368264EC]]></sign>
    </xml>
    复制代码

    同时Native支付将提取product_id,用于统一支付填参

    //提取product_id
    $product_id = $nativeCall->getProductId();

    2. 统一支付流程

    下面是固定参数

    复制代码
    //使用统一支付接口
    $unifiedOrder = new UnifiedOrder_pub();
    $this->parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
    $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
    $this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip    
    $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
    $this->parameters["sign"] = $this->getSign($this->parameters);//签名
    复制代码

    下面是其他参数

    复制代码
    $unifiedOrder->setParameter("body","贡献一分钱");//商品描述
    //自定义订单号,此处仅作举例
    $timeStamp = time();
    $out_trade_no = WxPayConf_pub::APPID."$timeStamp";
    $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 
    $unifiedOrder->setParameter("total_fee","1");//总金额
    $unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址 
    $unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
    $unifiedOrder->setParameter("product_id","$product_id");//用户标识
    //非必填参数,商户可根据实际情况选填
    //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号 
    //$unifiedOrder->setParameter("device_info","XXXX");//设备号 
    //$unifiedOrder->setParameter("attach","XXXX");//附加数据 
    //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
    //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 
    //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 
    //$unifiedOrder->setParameter("openid","XXXX");//用户标识
    复制代码

    然后统一支付获取prepay_id

    //获取prepay_id
    $prepay_id = $unifiedOrder->getPrepayId();

    而统一支付中获取prepray_id的流程是将XML数据

    复制代码
    <xml>
      <body><![CDATA[方倍工作室]]></body>
      <out_trade_no><![CDATA[wxdbfd43c561acxxxx1419768128]]></out_trade_no>
      <total_fee>1</total_fee>
      <notify_url><![CDATA[http://wxpay.fangbei.org/wxpayv3/demo/notify_url.php]]></notify_url>
      <trade_type><![CDATA[NATIVE]]></trade_type>
      <product_id><![CDATA[wxdbfd43c561acxxxxstatic]]></product_id>
      <appid><![CDATA[wxdbfd43c561acxxxx]]></appid>
      <mch_id>10012345</mch_id>
      <spbill_create_ip><![CDATA[11.12.16.120]]></spbill_create_ip>
      <nonce_str><![CDATA[fvqqssaahys7qc5cv16tr4qtf1iml3vm]]></nonce_str>
      <sign><![CDATA[F69B71CC28FA9398378F4DB417BAC3D7]]></sign>
    </xml>
    复制代码

    POST发送到统一支付接口

    https://api.mch.weixin.qq.com/pay/unifiedorder

    并收到如下响应的XML数据

    复制代码
    <xml>
        <return_code><![CDATA[SUCCESS]]></return_code>
        <return_msg><![CDATA[OK]]></return_msg>
        <appid><![CDATA[wxdbfd43c561acxxxx]]></appid>
        <mch_id><![CDATA[10012345]]></mch_id>
        <nonce_str><![CDATA[JLQ67G1EhjfZvlKv]]></nonce_str>
        <sign><![CDATA[7A4F2751F955C32EB65063CC9E3EAB57]]></sign>
        <result_code><![CDATA[SUCCESS]]></result_code>
        <prepay_id><![CDATA[wx2014122820020936799023550244567827]]></prepay_id>
        <trade_type><![CDATA[NATIVE]]></trade_type>
        <code_url><![CDATA[weixin://wxpay/bizpayurl?sr=yQtNpvo]]></code_url>
    </xml>
    复制代码

    完成上述统一支付之后,Native支付设置返回参数,实现代码如下

    复制代码
    //设置返回码
    //设置必填参数
    //appid已填,商户无需重复填写
    //mch_id已填,商户无需重复填写
    //noncestr已填,商户无需重复填写
    //sign已填,商户无需重复填写
    $nativeCall->setReturnParameter("return_code","SUCCESS");//返回状态码
    $nativeCall->setReturnParameter("result_code","SUCCESS");//业务结果
    $nativeCall->setReturnParameter("prepay_id","$prepay_id");//预支付ID
    
    //将结果返回微信
    $returnXml = $nativeCall->returnXml();
    echo $returnXml;
    复制代码

    上述代码生成的XML如下:

    复制代码
    <xml>
      <return_code><![CDATA[SUCCESS]]></return_code>
      <result_code><![CDATA[SUCCESS]]></result_code>
      <prepay_id><![CDATA[wx2014122820020936799023550244567827]]></prepay_id>
      <appid><![CDATA[wxdbfd43c561acxxxx]]></appid>
      <mch_id>10012345</mch_id>
      <nonce_str><![CDATA[e2bpc9fz3ykc2tcpipyvnb1l2qf8my3d]]></nonce_str>
      <sign><![CDATA[32C698EA795C0FBCDBCED622D1E01168]]></sign>
    </xml>
    复制代码

    这样,一个静态链接Native就完成了。

  • 相关阅读:
    Step by step Dynamics CRM 2013安装
    SQL Server 2012 Managed Service Account
    Step by step SQL Server 2012的安装
    Step by step 活动目录中添加一个子域
    Step by step 如何创建一个新森林
    向活动目录中添加一个子域
    活动目录的信任关系
    RAID 概述
    DNS 正向查找与反向查找
    Microsoft Dynamics CRM 2013 and 2011 Update Rollups and Service Packs
  • 原文地址:https://www.cnblogs.com/Alex80/p/4259645.html
Copyright © 2011-2022 走看看