微支付开发部分代码示例

最近公司在开发未支付,刚刚做出测试成功,腾讯平台的技术支持实在不敢恭维,死活联系不上,在测试过程中走了不少弯路,希望大家别像我一样走弯路。
微支付官网下载文档地址:http://download.csdn.net/detail/ethan19/7193855,


主要介绍JS API支付:
支付过程中,最主要的是数据处理,
首先,在Wxpayhelper.php中会处理各种你要使用的参数,比如out_trade_no,appid,partner,body等,


$this->load->library('Wxpayhelper');
$this->wxpayhelper->setParameter("bank_type", "WX");
$this->wxpayhelper->setParameter("body", "麦当劳");
$this->wxpayhelper->setParameter("partner", $partner);
$this->wxpayhelper->setParameter("out_trade_no", "NB12253018");
$this->wxpayhelper->setParameter("total_fee", "1");
$this->wxpayhelper->setParameter("fee_type", "1");
$this->wxpayhelper->setParameter("notify_url", $url);
$this->wxpayhelper->setParameter("spbill_create_ip", "127.0.0.1");
$this->wxpayhelper->setParameter("input_charset", "UTF-8");

$msg=$this->wxpayhelper->create_biz_package();



自此形成$msg信息(,貌似是json),

然后下载一个JS API支付的事例代码,官网上有(https://mp.weixin.qq.com/htmledition/res/bussiness-course2/wxm-pay-api-demo.zip),可以看到一下js代码,运行代码,可以看到支付成功

        <script language="javascript">


            // 当微信内置浏览器完成内部初始化后会触发WeixinJSBridgeReady事件。
            document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
                                      //公众号支付
                                      jQuery('a#getBrandWCPayRequest').click(function(e){
                                                                             WeixinJSBridge.invoke('getBrandWCPayRequest',<?= $msg?>,function(res){
                                                                                                   if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                                                                                                   // window.location.href="http://www.wepower365.com/order.php/order/re_pay";
                                                                                                    }else{


                                                                                                        //alert(11111111);
                                                                                                    }
                                                                                                   // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
                                                                                                   //因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。
                                                                                                   }); 
                                                                             
                                                                             });


                                      WeixinJSBridge.log('yo~ ready.');
                                      
                                      }, false)
            </script>


因为微信正式使用还需要测通其他接口(发货,告警,维权,还有一个隐形接口--订单查询)
暂时先写出发货,订单查询的接口

在所有接口我们要做的第一步就是获取access_token值


  function getAccessToken($appid, $appsecret) {
    $ch = curl_init();
    @curl_setopt($ch, CURLOPT_URL, 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret‘);
    @curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    @curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    @curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    @curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    //@curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $tmpInfo = curl_exec($ch);
    if (curl_errno($ch)) {
      return curl_error($ch);
    }
    curl_close($ch);
    return $tmpInfo;
  }

  首先获取订单接口
  详细参数可以看下载的接口文档
    public function check_good(){
    
    $access_token= $this->getAccessToken();
    $reponse_array = json_decode($access_token);
    $access_token= $reponse_array->access_token;
                          
    $sign = $this->getSign("out_trade_no","partner","PaySignKey");
    
    $app_signature = $this->getAppsignature("appid","PaySignKey","out_trade_no=NA1398414173343&partner=partner&sign=".$sign."","1397177957");
    $data='{"appid" : "appid","package" : "out_trade_no=NA1398414173343&partner=partner&sign='.$sign.'","timestamp" : "1397177957","app_signature" : "'.$app_signature.'","sign_method" : "sha1"}';
    //echo $data;exit;
    $result = $this->getContent($access_token,'orderquery',$data);
    $result_array = json_decode($result);
    print_r($result_array);exit;
  }
  
  private function getAppsignature($appid,$appkey,$package,$timestamp){
    $array=array("appid"=>$appid,"appkey"=>$appkey,"package"=>$package,"timestamp"=>$timestamp);
    
    $array = $this->formatBizQueryParaMap($array, false);
    return sha1($array);
  }
  
  private function formatBizQueryParaMap($paraMap, $urlencode){
    $buff = "";
    ksort($paraMap);
    foreach ($paraMap as $k => $v){
    //  if (null != $v && "null" != $v && "sign" != $k) {
          if($urlencode){
           $v = urlencode($v);
        }
        $buff .= strtolower($k) . "=" . $v . "&";
      //}
    }
    $reqPar;
    if (strlen($buff) > 0) {
      $reqPar = substr($buff, 0, strlen($buff)-1);
    }
    return $reqPar;
  }
  
  private function getSign($number,$partner,$key){
    $content  = "out_trade_no=".$number."&partner=".$partner."&key=".$key;
    
    $sign   = strtoupper(md5($content));
    return $sign;
  }
    private function getContent($access_token,$way,$data){
    $ch = curl_init();
    @curl_setopt($ch, CURLOPT_URL, 'https://api.weixin.qq.com/pay/'.$way.'?access_token='.$access_token);
    @curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    @curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    @curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    @curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    @curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $tmpInfo = curl_exec($ch);
    if (curl_errno($ch)) {
      return curl_error($ch);
    }
    curl_close($ch);
    return $tmpInfo;
  }

  //发货接口


    function deliver(){


    $access_token= $this->getAccessToken();
    $reponse_array = json_decode($access_token);
    $access_token= $reponse_array->access_token;
    $app_signature = $this->getAppsignature_d("appid","PaySignKey","ojggLjxMcdt9nAhO0dvNFr5vLIHE","1218347401201404133192821670","NB4321000","1397400108","1","ok");
    $data = '{"appid":"appid","openid":"ojggLjxMcdt9nAhO0dvNFr5vLIHE","transid":"1218347401201404133192821670","out_trade_no":"NB4321000","deliver_timestamp":"1397400108","deliver_status":"1","deliver_msg":"ok","app_signature":"'.$app_signature.'","sign_method" : "sha1"}';


    //var_dump($data);die;
    ///"appid",
    //"openid",用户名
    //"transid"交易单号
    //"out_trade_no"第三方订单号
    //""deliver_timestamp""linux时间戳
    //"deliver_status"发货状态,1成功,0失败
    //"deliver_msg"一般ok,发货信息
    //"app_signature"签名
    //"sign_method",,"sha1"加密方式

    //app_signature签名生产方式


    //appid、appkey、openid、transid、out_trade_no、deliver_timestamp、deliver_status、deliver_msg;
    //注意点,时间保持一致,入库时间要和获取app_signature的时间保持一致
    
    $result = $this->getContent($access_token,'delivernotify',$data);
    $result_array = json_decode($result);
    var_dump($result_array);die;
    
  }


  public function getAppsignature_d($appid,$appkey,$openid,$transid,$out_trade_no,$deliver_timestamp,$deliver_status,$deliver_msg){
    $array=array("appid"=>"appid","appkey"=>$appkey,"openid"=>$openid,"transid"=>$transid,"out_trade_no"=>$out_trade_no,"deliver_timestamp"=>"1397400108","deliver_status"=>$deliver_status,"deliver_msg"=>$deliver_msg);
    
    $array = $this->formatBizQueryParaMap($array, false);
    return sha1($array);


  }
在拼接app_signature时经常或报49004的错误,这个是因为app_signature拼接错误的原因,可能是个时间戳错了,也可能是个商品单号错了,仔细检查一下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值