微信jsapi支付

Posted 御世制人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信jsapi支付相关的知识,希望对你有一定的参考价值。

页面

<div class="fix-bottom-bar">
        <a href="javascript:;" class="wx-pay-btn" onclick="callpay()">立即支付</a>
    </div>

    <script type="text/javascript">
        //调用微信JS api 支付
        function jsApiCall()
        {
            WeixinJSBridge.invoke(
                ‘getBrandWCPayRequest‘,
                <?php echo $parameter; ?>,
                function(res){
                    if(res.err_msg == "get_brand_wcpay_request:ok"){
                        window.location.href="/payment/status/index/?<?php echo ‘sign=‘.md5(‘11‘).‘&ordersn=‘.$ordersn;?>";
                    }else{
                        //返回跳转到订单详情页面
                        window.location.href="/payment/status/?<?php echo ‘sign=‘.md5(‘00‘);?>";
                    }
                }
            );
        }

        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();
            }
        }
    </script>

  封装一个方法调用他

//mobile 微信公众号
$arr = $obj->submit($info);

submit方法

<?php defined(‘SYSPATH‘) or die(‘No direct script access.‘);

/**
 *  mobile 微信扫码支付
 * Class Pay_Mobile_WxPay
 */
class Pay_Mobile_WxPay
{
    //微信支付目录
    private $_wxPayDir;
    //异步通知
    const NOTIFY_URL = ‘/callback/index/Pay_Mobile_WxPay-notify_url/‘;

    /**
     * 微信支付初始化
     */
    public function __construct()
    {
        $this->_wxPayDir = Common::C(‘interface_path‘) . ‘mobile/wxpay/‘;
        //绑定支付的APPID
        define(‘APPID‘, Common::C(‘cfg_wxpay_appid‘));
        //商户号
        define(‘MCHID‘, Common::C(‘cfg_wxpay_mchid‘));
        //商户支付密钥
        define(‘KEY‘, Common::C(‘cfg_wxpay_key‘));
        //公众帐号secert
        define(‘APPSECRET‘, Common::C(‘cfg_wxpay_appsecret‘));
    }

    /**
     * 支付数据格式化
     * @param $data
     * @return array
     */
    public function submit($data)
    {
        require $this->_wxPayDir . ‘jsapi/index.php‘;
        $jsApiPay = new JsApiPay();
        $openId = $jsApiPay->GetOpenid();
这就是官网的例子然后吧参数替换成自己的即可关键是微信wxpay,api等等这些文档路径要引入正确就行 if (!isset($_GET[‘code‘])) { exit; } $ordersn = $this->generate_ordersn($data[‘ordersn‘]); $input = new WxPayUnifiedOrder(); $input->SetBody($ordersn); //商品描述 $input->SetAttach($data[‘remark‘]); //备注 $input->SetOut_trade_no($ordersn); //商户订单号 $input->SetTotal_fee($data[‘total‘] * 100);//总金额,以分为单位 $input->SetTime_start(date("YmdHis"));//交易起始时间 $input->SetTime_expire(date("YmdHis", time() + 6000));//交易结束时间 $input->SetGoods_tag("tag");//商品标记 $input->SetNotify_url(Common::C(‘base_url‘) . self::NOTIFY_URL); //异步通知 $input->SetTrade_type("JSAPI"); $input->SetProduct_id($data[‘ordersn‘]); $input->SetOpenid($openId); $order = WxPayApi::unifiedOrder($input); $jsApiParameters = $jsApiPay->GetJsApiParameters($order); $arr = array( ‘parameter‘ => $jsApiParameters, ‘productname‘ => $data[‘productname‘], ‘total_fee‘ => $data[‘total‘], ‘ordersn‘ => $data[‘ordersn‘], ‘template‘ => Common::C(‘template_dir‘) . ‘mobile/wx_jsapi‘ ); return $arr; } /** * 微信支付异步通知回调地址 */ public function notify_url() { require $this->_wxPayDir . ‘jsapi/notify.php‘; $notify = new notify(); $notify->Handle(true); } /** * @function 生成微信支付订单号(规则:原订单号+当前时间time()+6位随机数) * @param $ordersn * @return 返回32位订单号. */ private function generate_ordersn($ordersn) { $rand_num = St_Math::get_random_number(6); return $ordersn.time().$rand_num; } }

  还有一点,在支付成功后的毁掉地址里面notify这个文件夹里处理你本地订单的状态信息就行了

$bool = false;
        //返回状态码、业务结果
        if (array_key_exists("return_code", $data) && array_key_exists("result_code", $data) && $data[‘return_code‘] == ‘SUCCESS‘ && $data[‘result_code‘] == ‘SUCCESS‘)
        {
            //查询订单
            if (isset($data["out_trade_no"]) && $data["out_trade_no"] != "")
            {
                $input = new WxPayOrderQuery();
                $input->SetOut_trade_no($data["out_trade_no"]);//商户订单号
                $result = WxPayApi::orderQuery($input);
                $tip = ‘信息:微信公众号交易,订单金额与实际支付不一致‘;
                //这里针对微信订单号作特殊处理,去掉后面的16位字符
                $ordersn = substr($data[‘out_trade_no‘],0,strlen($data[‘out_trade_no‘])-16);
                if (isset($result[‘total_fee‘]) && Common::total_fee_confirm($ordersn, $result[‘total_fee‘] / 100, $tip))
                {
                    $bool = true;
                    $method = Common::C(‘mobile‘);

                    Common::pay_success($ordersn, $method[‘method‘][‘8‘][‘name‘]);
                    $online_transaction_no = array(‘source‘=>‘wxpay‘,‘transaction_no‘=>$data[‘transaction_id‘]);
                    //写入微信订单号
                    DB::update(‘member_order‘)->set(array(‘online_transaction_no‘=>json_encode($online_transaction_no)))
                        ->where(‘ordersn‘,‘=‘,$ordersn)
                        ->execute();

                }
            }
            else
            {
                new Pay_Exception("信息:微信公众号下单,未会返回商品订单号");
            }
        }
        else
        {
            new Pay_Exception("信息:微信公众号交易错误(msg_{$data[‘return_msg‘]})");
        }
        return $bool;

  



以上是关于微信jsapi支付的主要内容,如果未能解决你的问题,请参考以下文章

微信h5支付和jsapi支付的区别

微信支付开发 c# SDK JSAPI支付开发的流程和微信大坑

微信支付(JSAPI) - Java

微信jsapi支付v3 显示商户签名错误

微信支付之JSAPI公众号支付

PHP微信三方平台-代公众号发起微信支付(jsAPI)