天天看点

微信支付JSAPI支付

公司业务需求,在公众号中加入微信支付和支付宝支付 效果图如下:
微信支付JSAPI支付
菜单的设计直接在公众号中设置就好啦,两个子菜单都是跳转网页形式直接把你服务器上的url复制上就好。

一些其他的很重要的配置:

微信支付中开发配置 支付测试url
微信支付JSAPI支付
这里是报错
微信支付JSAPI支付
开始以为是域名没有备案什么的,不要慌,要再写一级目录才可以,同时开发的时候别忘记把自己加入测试白名单。 一不小心微信号曝光了,有问题的可以加微信交流
微信支付JSAPI支付
用户进行微信支付的是后首先要进行用户授权登录的,程序的角度就是拿到用户的openid
微信支付JSAPI支付
微信支付JSAPI支付
还有两个加密证书要登录微信支付的商户号进行下载后放到项目中 配置还要一些appid,appscret直接粘贴到项目config就可以啦

代码说明:

具体的代码我是用php编写的两个支付项目都集成到thinkphp框架中啦

JSAPI支付的大体流程是:用户访问后授权登录(这个授权有时是静默授权就是不会询问你)然后拿到用户对于本公众号的唯一用户id 也就是openid(虽说你是用你自己的域名服务器做支付但其实还是跟你的公众号有直接关联的),后端(php)拿到openid后在加上一些必要的订单信息按相应的签名算法拼接成一个sign(就相当于与微信端交互的一把钥匙、密码),之后把交易信息加上sign发给微信端进行支付请求

require_once "/wxpay/lib/WxPay.Api.php";
    require_once "/wxpay/test/WxPay.JsApiPay.php";
    require_once '/wxpay/test/log.php';
    $tools = new \JsApiPay();
    // $openId = $tools->GetOpenid();
    $input = new \WxPayUnifiedOrder();
    $openId = session('openId');
    $input->SetBody("test");
    $input->SetAttach("test");
    // $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
    $input->SetOut_trade_no($out_trade_no);
    $input->SetTotal_fee("$total_amount");
    $input->SetTime_start(date("YmdHis"));
    $input->SetTime_expire(date("YmdHis", time() + ));
    $input->SetGoods_tag("test");
    $input->SetNotify_url("http://myalipay.ittun.com/wxpay/example/notify.php");
    $input->SetTrade_type("JSAPI");
    $input->SetOpenid($openId);
    $order = \WxPayApi::unifiedOrder($input);
    $jsApiParameters = $tools->GetJsApiParameters($order);
    // var_dump($jsApiParameters);die;
    echo "$jsApiParameters";die;
           

根据业务需要我这里写的是一个ajax接口,用于前端获取交易的信息,这里的$jsApiParameters本事就是一个json字符串,所以就不需要在进行json转换了,转换后会出现参数错误,具体参数如下:

string(222) “{“appId”:”wxbe9e6d43b4206f77”,

“nonceStr”:”b58ncc5n7i2xwbvdeidkx2h2ctoyg5ay”,

“package”:”prepay_id=wx201704141126330a11b5b4430487803422”,

“signType”:”MD5”,”timeStamp”:”1492140457”,

“paySign”:”794FC7A3C811E40CA8D826FD48AB3BD9”}”

下面是前端拿到数据后的一些操作:

var jsapi;
       ajax({
                       url:'/index.php/home/order/wxpayed',
                       type:'post',
                       data:{
                           'product_id':aLa[iNow].id,
                           'product_name':oH
                       },success:function (str) {
                           var str=eval('('+str+')');
                          //  edit = str.editl;
                           jsapi = str;

                           console.log(str);
                           callpay();
                       }
                   })
                }

                function jsApiCall()
                {
                  alert(jsapi)
                    WeixinJSBridge.invoke(
                        'getBrandWCPayRequest',
                        jsapi,
                        function(res){
                            WeixinJSBridge.log(res.err_msg);
                            alert(res.err_code+res.err_desc+res.err_msg);
                        }
                    );
                }

                function callpay()
                {
                    if (typeof WeixinJSBridge == "undefined"){
                        if( document.addEventListener ){
                            document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
                        }else if (document.attachEvent){
                            document.attachEvent('WeixinJSBridgeReady', jsApiCall);
                            document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
                        }
                    }else{
                        jsApiCall();
                    }
                }
           

拿到后端传来的交易信息后,把它赋值给全局变量jsapi然后通过jsapi带入到jsApiCall()函数中

在ajax success后,调起callpay()函数而此时微信支付就会被成功唤起

遇到的bug:

把一个官方sdk集成到thinkphp框架中,需要注意一些文件引入问题,明明成功引入文件却不能实例化文件中的对象,最后google找到了问题的答案,这就是我代码中new 一个类名前加一个 “\”的原因 。$input = new \WxPayUnifiedOrder();

在获取到交易信息后传到前端的时候,按以往的思维方式json_encode后就报了错误

继续阅读