精华内容
下载资源
问答
  • 最近做了一个小程序用到了微信支付及零钱提现功能。 准备工作,开发之前,我们需要有下面这些东西: appId 密钥(小程序配置界面) 商户号 api密钥(商家后台自己设置) 1,小程序代码实现 <view class='pay_...

    最近做了一个小程序用到了微信支付及零钱提现功能。

    准备工作,开发之前,我们需要有下面这些东西:

    • appId
    • 密钥(小程序配置界面)
    • 商户号
    • api密钥(商家后台自己设置)

    1,小程序代码实现

          <view class='pay_btn_view'>
                 <button class='pay_btn' bindtap='btn_to_pay' 
                         data-keyword="{{hmhDataInfo}}">立即购买</button>
          </view>

    小程序js实现部分 

    btn_to_pay: function (e) {
    
    
        //显示加载数据
        this.setData({
          loadingHidden: false
        });
    
        var paymoney = e.currentTarget.dataset.keyword.serviceprice;
        console.info(" === " + this.data.pay_state + " , money = " + paymoney);
        var content = "";
        var type = 0;
        if (this.data.pay_state==0){
          content = "你选择了月";
          type = 1;
        } else if (this.data.pay_state==1){
          content = "你选择了三个月";
          type = 2;
        } else if (this.data.pay_state==2){
          content = "你选择了年";
          type = 3;
        } else if (this.data.pay_state == 3) {
          content = "你选择了终生";
          type = 4;
        }
    
        var openid = wx.getStorageSync("openId");
        if (openid != '') {
          //关闭授权层
          this.setData({
            isRuleTrue: false,
          })
        } else {
          //显示弹出层
          this.setData({
            isRuleTrue: true
          })
        }
    
        var that = this;
        wx.request({
          url: getApp().data.servsers + '/dp/sys/wxpay/topay?price=' + paymoney + '&open_id=' + openid + '&type=' + type,
          method: "GET",
          header: {
            'content-type': 'application/text'
          },
          success: function (res) {
            that.setData({
              loadingHidden: true
            });
           
            var nonceStr = res.data.userInfoPay.nonceStr;
            var packages = res.data.userInfoPay.packages;
            var pay_price = res.data.userInfoPay.pay_price;
            var sign = res.data.userInfoPay.sign;
            var timeStamp = res.data.userInfoPay.timeStamp;
            //只有status 为 0 才可以正常支付
            var status = res.data.userInfoPay.status;
            if(status==0){
              wx.requestPayment({
                'timeStamp': timeStamp,
                'nonceStr': nonceStr,
                'package': packages,
                'signType': 'MD5',
                'paySign': sign,
                'success': function (succ) {
                    wx.showModal({
                      title: '提示',
                      content: '支付成功',
                      success: function (e) { 
                          if(e.confirm){
                              console.info(" success === ");
                              //跳转到用户信息页面
                            setTimeout(function () {
                              wx.switchTab({
                                url: '../myinfo/myinfo'
                              })
                            }, 500)
    
                          }else if(e.cancel){
                            console.info(" cancel === ");
                          }
                      },//接口调用成功
                      fail: function () { 
    
                      },  //接口调用失败的回调函数  
                      complete: function () {
    
                       } //接口调用结束的回调函数  
                    });
                
                },
                'fail': function (err) {
                    wx.showModal({
                      title: '提示',
                      content: '支付失败'
                    });
                },
                'complete': function (comp) {
    
                }
              })
            }else{
              wx.showModal({
                title: '提示',
                content: '支付验证失败'
              });
            }
          }
        })
    
      },

     

    2,后台接口实现

     

     /****
         * 小程序端支付接口
         * oZvme4q2Oi7Dz3FChXc4G_3kqw28
         * @return
         * @throws Exception
         */
        @RequestMapping("/topay")
        public R wxUserPay(HttpServletRequest request, HttpServletResponse response, HttpSession httpSession) throws Exception {
            logger.info("wechat pay #####################################################");
            String pay_price = request.getParameter("price");
            String open_id = request.getParameter("open_id");
            String type = request.getParameter("type");
            String orderNo = Sha1Util.getOrderNumber();
            Map<String, Object> resultInfo = new HashMap<String, Object>();
            if(!"".equals(open_id)&&open_id!=null){
                logger.info("wxUserPay >>>>> "+pay_price+" , open_id = "+open_id+ " , orderNo = "+orderNo);
                //先查询用户然后,生成订单保存到数据库(状态为待支付)
                HmhOrderInfoEntity orderInfoEntity = new HmhOrderInfoEntity();
                orderInfoEntity.setCreateTime(DateUtils.format(new Date(),DateUtils.DATE_TIME_PATTERN));
                orderInfoEntity.setOpenid(open_id);
                orderInfoEntity.setPayPrice(pay_price);
                orderInfoEntity.setStatus(0); //等待付款
                orderInfoEntity.setOrderid(orderNo);
                orderInfoEntity.setOrderType(0);
                orderInfoEntity.setType(Integer.parseInt(type));
                hmhOrderInfoService.saveHmhOrderInfo(orderInfoEntity);
                //金额转化为分为单位
                float sessionmoney = Float.parseFloat(pay_price);
                String finalmoney = String.format("%.2f", sessionmoney);
                finalmoney = finalmoney.replace(".", "");
                //商户相关资料
                String appid = HmhConfig.APP_ID;
                String appsecret = HmhConfig.APP_secret;
                String partner = HmhConfig.pertenr;
                String partnerkey = HmhConfig.pertnerKey;
                String currTime = TenpayUtil.getCurrTime();
                //8位日期
                String strTime = currTime.substring(8, currTime.length());
                //四位随机数
                String strRandom = TenpayUtil.buildRandom(4) + "";
                //10位序列号,可以自行调整。
                String strReq = strTime + strRandom;
                //商户号
                String mch_id = partner;
                //子商户号  非必输
                //String sub_mch_id="";
                //设备号   非必输
                String device_info="";
                //随机数
                String nonce_str = strReq;
                //商品描述
                //String body = describe;
                //商品描述根据情况修改
                String body = "xxx管理服务费";
                //附加数据
                String attach = "";
                //商户订单号
                String out_trade_no = orderNo;
                int intMoney = Integer.parseInt(finalmoney);
                //总金额以分为单位,不带小数点
                int total_fee = intMoney;
                //订单生成的机器 IP
                String spbill_create_ip = request.getRemoteAddr();
                //订 单 生 成 时 间   非必输
    //			String time_start ="";
                //订单失效时间      非必输
    //			String time_expire = "";
                //商品标记   非必输
    //			String goods_tag = "";
                //这里notify_url是 支付完成后微信发给该链接信息,可以判断会员是否支付成功,改变订单状态等。
                String notify_url =wxpay_notify;
                String trade_type = "JSAPI";
                //非必输
                SortedMap<String, String> packageParams = new TreeMap<String, String>();
                packageParams.put("appid", appid);
                packageParams.put("mch_id", mch_id);
                packageParams.put("nonce_str", nonce_str);
                packageParams.put("body", body);
                packageParams.put("attach", attach);
                packageParams.put("out_trade_no", out_trade_no);
    
                //这里写的金额为1 分到时修改
                packageParams.put("total_fee", String.valueOf(total_fee));
                packageParams.put("spbill_create_ip", spbill_create_ip);
                packageParams.put("notify_url", notify_url);
                packageParams.put("trade_type", trade_type);
                packageParams.put("openid", open_id);
                RequestHandler reqHandler = new RequestHandler(request, response);
                reqHandler.init(appid, appsecret, partnerkey);
                String sign = reqHandler.createSign(packageParams);
                String xml="<xml>"+
                        "<appid>"+appid+"</appid>"+
                        "<mch_id>"+mch_id+"</mch_id>"+
                        "<nonce_str>"+nonce_str+"</nonce_str>"+
                        "<sign>"+sign+"</sign>"+
                        "<body><![CDATA["+body+"]]></body>"+
                        "<attach>"+attach+"</attach>"+
                        "<out_trade_no>"+out_trade_no+"</out_trade_no>"+
                        //金额,这里写的1 分到时修改
                        "<total_fee>"+String.valueOf(total_fee)+"</total_fee>"+
                        "<spbill_create_ip>"+spbill_create_ip+"</spbill_create_ip>"+
                        "<notify_url>"+notify_url+"</notify_url>"+
                        "<trade_type>"+trade_type+"</trade_type>"+
                        "<openid>"+open_id+"</openid>"+
                        "</xml>";
                String createOrderURL = HmhConfig.unifiedorder;
                String prepay_id="";
                try {
                    prepay_id = new GetWxOrderno().getPayNo(createOrderURL, xml);
                    logger.info("prepay_id >>>>> "+prepay_id);
                    if("".equals(prepay_id)){
                        resultInfo.put("status",3);
                        resultInfo.put("msg","统一支付接口获取预支付订单出错");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                SortedMap<String, String> finalpackage = new TreeMap<String, String>();
                String appid2 = appid;
                String timestamp = Sha1Util.getTimeStamp();
                String nonceStr2 = nonce_str;
                String prepay_id2 = "prepay_id="+prepay_id;
                String packages = prepay_id2;
                finalpackage.put("appId", appid2);
                finalpackage.put("timeStamp", timestamp);
                finalpackage.put("nonceStr", nonceStr2);
                finalpackage.put("package", packages);
                finalpackage.put("signType", "MD5");
                String finalsign = reqHandler.createSign(finalpackage);
                Map<String, Object> map= new HashMap<String, Object>();
                map.put("status", 0);
                map.put("appId", appid2);
                map.put("timeStamp", timestamp);
                map.put("nonceStr", nonceStr2);
                map.put("packages", packages);
                map.put("sign", finalsign);
                map.put("pay_price", pay_price);
                map.put("open_id", open_id);
                resultInfo.put("userInfoPay",map);
                resultInfo.put("status",0);
                resultInfo.put("msg","支付成功");
            }else{
                logger.info("用户open_id为空");
                resultInfo.put("status",1);
                resultInfo.put("msg","用户open_id为空");
            }
            return R.ok(1,resultInfo);
        }

    小程序提现接口java代码实现

    //提现到零钱
        //https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
        @RequestMapping("/transfer")
        public R transfer(HttpServletRequest request, HttpServletResponse response) {
    
            String openid = request.getParameter("openid");
            String amount = request.getParameter("amount");
    
            Map<String, Object> resultInfo = new HashMap<String, Object>();
            String tk_order_id = Sha1Util.getTXOrderNumber();
            String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
            System.out.println(" == >> "+tk_order_id);
            String mch_appid = HmhConfig.APP_ID; //商户账号appid
            String mchid = HmhConfig.pertenr; //商户号
            String nonce_str = uuid; //随机32位字符串
            String partner_trade_no = tk_order_id; //商户订单号
    //        String openid = "";//用户openid
            String check_name = "NO_CHECK"; //校验用户姓名选项 (NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名)
            String re_user_name = "xxx"; //收款用户姓名
    //        String amount = ""; //企业付款金额,单位为分
            String desc = "xxx"; //企业付款备注
            String spbill_create_ip = "10.2.3.11"; //Ip地址
    
            SortedMap<String, String> packageParams = new TreeMap<String, String>();
            packageParams.put("mch_appid", mch_appid);
            packageParams.put("mchid", mchid);
            packageParams.put("nonce_str", nonce_str);
            packageParams.put("partner_trade_no", partner_trade_no);
            packageParams.put("openid", openid);
            packageParams.put("check_name", check_name);
            packageParams.put("re_user_name", re_user_name);
            packageParams.put("amount", amount);
            packageParams.put("desc", desc);
            packageParams.put("spbill_create_ip", spbill_create_ip);
    
            RequestHandler reqHandler = new RequestHandler(request, response);
            reqHandler.init(mch_appid, HmhConfig.APP_secret, HmhConfig.pertnerKey);
            String sign = reqHandler.createSign(packageParams); 签名
    
            String transferXml = "<xml>" +
                    "<mch_appid>"+mch_appid+"</mch_appid>" +
                    "<mchid>"+mchid+"</mchid>" +
                    "<nonce_str>"+nonce_str+"</nonce_str>" +
                    "<partner_trade_no>"+partner_trade_no+"</partner_trade_no>" +
                    "<openid>"+openid+"</openid>" +
                    "<check_name>"+check_name+"</check_name>" +
                    "<re_user_name>"+re_user_name+"</re_user_name>" +
                    "<amount>"+amount+"</amount>" +
                    "<desc>"+desc+"</desc>" +
                    "<spbill_create_ip>"+spbill_create_ip+"</spbill_create_ip>" +
                    "<sign>"+sign+"</sign>" +
                    "</xml>";
    
            String  result= new GetWxOrderno().getPayNo(HmhConfig.transferurl, transferXml);
    
            resultInfo.put("status",1);
            resultInfo.put("msg",result);
    
            return R.ok(1,resultInfo);
        }
    

    注意,小程序提现需要配置证书

     当发现调用不起来支付时请检查,域名,商户后台配置支付目录。

    微信支付文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1

    更多优质文章请关注我的微信公众号【java后端技术精选】,回复“1024”和“面试”可以领取优质的视频学习资源

    展开全文
  • 开通小程序收款权限4.2.总体流程问题:5.1.在alipay.trade.create中需要传递给服务器用户的buyer_id即user_id6.如何获取user_id:7.1).在支付宝前段获得用户授权,得到authCode8.2).调用支付宝接口传递授权码,得到...

    支付宝小程序支付接口1.

    相关文档2.

    小程序支付开通官方文档3.

    1.开通小程序收款权限4.

    2.总体流程问题:5.

    1.在alipay.trade.create中需要传递给服务器用户的buyer_id即user_id6.

    如何获取user_id:7.

    1).在支付宝前段获得用户授权,得到authCode8.

    2).调用支付宝接口传递授权码,得到用户其他信息(useridaccess_token)9.

    获取用户信息官方接口publicStringgetUserId(Stringauthcode){AlipayClientalipayClientnewDefaultAlipayClient("https://openapi.alipay.com/gateway.do",aliPayConfig.getAPP_ID(),aliPayConfig.getAPP_PRIVATE_KEY(),"json","GBK",aliPayConfig.getALIPAY_PUBLIC_KEY(),"RSA2");AlipaySystemOauthTokenRequestrequestnewAlipaySystemOauthTokenRequest();request.setGrantType("authorization_code");request.setCode(authcode);request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");try{AlipaySystemOauthTokenResponseresponsealipayClient.execute(request);if(response.isSuccess()){returnresponse.getUserId();}else{logger.info("获取用户id失败");}}catch(AlipayApiExceptione){e.printStackTrace();}returnnull;}10.

    2.在调用alipay.trade.create时,需要传递给服务器支付宝公匙和小程序的私匙11.

    需要在小程序界面设置12.

    3.回调url需要我们在调用alipay.trade.create时传递给服务器13.

    4.java后端使用alipay.trade.create官方示例时会出现参数无效错误,使用model方法传递参数publicStringgetTradeNO(Stringfee,Stringauthcode,Stringphone){AlipayClientalipayClientnewDefaultAlipayClient("https://openapi.alipay.com/gateway.do",aliPayConfig.getAPP_ID(),aliPayConfig.getAPP_PRIVATE_KEY(),"json","UTF-8",aliPayConfig.getALIPAY_PUBLIC_KEY(),"RSA2");//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.create.AlipayTradeCreateRequestrequestnewAlipayTradeCreateRequest();//SDK已经封装掉了公共参数,这里只需要传入业务参数。AlipayTradeCreateModelmodelnewAlipayTradeCreateModel();model.setBuyerId(buyerId);//这里是刚刚获得的useridmodel.setOutTradeNo(out_trade_no);//这个是我们自己创建的订单号,便于处理后面的回调函数model.setSubject("geeksmallprogramrecharge");model.setTotalAmount(fee);//支付宝后端单位为元request.setNotifyUrl(aliPayConfig.getNotifyUrl());//用户支付成功后,支付宝会给notifyurl发送请求request.setBizModel(model);//request.setBizContent("{"+//""out_trade_no":"+out_trade_no+','+//""total_amount":"+fee+','+//""subject":"极市,小程序充值","+//""buyer_id":"+buyerId+','+//"}");不能使用这种方式支付,不然会出现参数无效错误try{//使用的是executeAlipayTradeCreateResponseresponsealipayClient.execute(request);Stringtrade_noresponse.getTradeNo();//获取返回的tradeNO。System.out.println(response.getBody());returntrade_no;}catch(AlipayApiExceptione){e.printStackTrace();System.out.println("获取订单号失败");return"获取订单号失败";}}14.

    5.回调函数验签失败,当支付宝发送给我们消息时如果有中文,当我们使用错误的编码模式时会出现中文乱码导致验签失败

    展开全文
  • Python实实现现微微信信小小程程序序支支付付功功能能 这篇文章主要介绍了Python实现微信小程序支付功能 ,本文通过实例代码流程图给大家介绍的非常详细具有一 定的 考借鉴价值需要的朋友可以 考下 正正文文 由于最近...
  • 一款将支付宝收款二维码和微信收款二维码合成一个收款二维码的工具 GOOD GOOD MASTER Feature_1 Feature_2
  • 微信小程序之如何注册微信小程序

    千次阅读 2017-01-23 23:51:47
    微信小程序之如何注册微信小程序


    注册小程序帐号

     

    在微信公众平台官网首页(mp.weixin.qq.com)点击右上角的“立即注册”按钮。


      

    选择注册的帐号类型

     

    显示了4选项,我们现在是注册小程序,所以选择小程序

     

     


    填写邮箱和密码


    请填写未注册过公众平台、开放平台、企业号、未绑定个人号的邮箱。

     


    激活邮箱


    登录邮箱,查收激活邮件,点击激活链接。

     

     

     

    填写主体信息

    点击激活链接后,继续下一步的注册流程。请选择主体类型选择,完善主体信息和管理员信息。

     

     

    选择主体类型

     

    主体类型说明如下:

    帐号主体

    范围

    个人

    18岁以上有国内身份信息的微信实名用户

    企业

    企业、分支机构、企业相关品牌。

    企业(个体工商户)

    个体工商户。

    政府

    国内、各级、各类政府机构、事业单位、具有行政职能的社会组织等。目前主要覆盖公安机构、党团机构、司法机构、交通机构、旅游机构、工商税务机构、市政机构等。

    媒体

    报纸、杂志、电视、电台、通讯社、其他等。

    其他组织

    不属于政府、媒体、企业或个人的类型。

     

     

    填写主体信息并选择验证方式

     

    个人类型

    只需要填写身份证、和手机等信息即可完成注册

     

    tips:

    个人类型暂不支持微信认证、微信支付及高级接口能力。

     

     

    企业类型帐号可选择两种主体验证方式

    方式一:需要用公司的对公账户向腾讯公司打款来验证主体身份。打款信息在提交主体信息后可以查看到。

    方式二:通过微信认证验证主体身份,需支付300元认证费。认证通过前,小程序部分功能暂无法使用


    政府、媒体、其他组织类型帐号

    必须通过微信认证验证主体身份。认证通过前,小程序部分功能暂无法使用

     

    填写管理员信息

     

    确认主体信息不可变更

     

    点击确认完成注册流程

    选择对公打款的用户,请根据页面提示,向指定的收款帐号汇入指定金额。 注意:请在10天内完成汇款,否则将注册失败


    选择通过微信认证验证主体身份的用户,完成注册流程后请尽快进行微信认证,认证完成之前部分功能暂不可使用。

     

     

     


    展开全文
  • 十 Node.js实现微信小程序支付功能一 开发前提二 支付流程介绍三 上代码1.小程序端发起后台请求,完成统一下单1.1 小程序端发起后台请求1.2 Node.js后台接收请求,完成统一下单(重点)1.3 获取统一下单的返回数据,...

    一 开发前提

    1.一个注册好,并且通过微信认证的,主体信息不能是个人的小程序
    主体信息为个人的小程序是没有微信支付功能的,并且也无法获取用户手机号码
    2.一个注册好并且通过微信认证的商户号
    3.商户号与小程序绑定
    4.这篇文章是以旧版微信支付为例开发微信支付。文档地址:旧版微信支付文档

    二 支付流程介绍

    1.由小程序端发起后台请求,后台根据传回的参数请求微信同一下单接口,将拿到的参数返回给小程序端,再由小程序拉起微信支付,支付完成以后,在回调函数中执行对应的更新操作。

    三 上代码

    1.小程序端发起后台请求,完成统一下单

    1.1 小程序端发起后台请求

    // request是我自己封装的wx.request方法,方便调用。
    // wechatapp/wechatpay是我的接口地址,以post方式访问
    // data 是参数对象
    request('wechatapp/wechatpay', data).then(res => {
          let result = res.data
          //result 是后台返回的数据,我的封装格式如下:
          // {
          //     flag:Boolean,       //用于判断请求结果是否正常
          //     state:Int,          //状态码,用于确定请求状态是否正常
          //     data:Array|Object,  //返回的数据,根据情况返回数组或者对象,增删改操作不返回data
          //     message:String,     //增删改的操作完成提示
          //     error:String        //增删改的错误提示
          // }
          if (result.flag) {
             let obj = result.data
             //这里得到微信统一下单的数据 
             //拉起小程序微信支付,此处粘贴1.3节点的代码
             //**************************************
          }
     })
    

    1.2 Node.js后台接收请求,完成统一下单(重点)

    //此处是Node.js后台的router,与1.1步骤中的访问API一致
    wechatapp.post('/wechatpay', (req, res) => {
        let b = req.body
        //PayOrder方法中封装了完成微信统一下单的全部重要内容
        // req.ip 是当前访问该接口的ip地址,返回一个IPv6格式的地址
        // b.openid 是当前请求访问该接口的唯一码,该接口需要在小程序中完成登录才能获得,然后传回后台
        common2.PayOrder(b, b.openid, req.ip, result => {
            res.send(result)
        })
    })
    

    下面是PayOrder方法的完整内容
    需要引入的第三方module:
    1.request 用于访问第三方接口 npm i request
    2. md5 用于完成MD5加密 npm i md5
    3. xml-js 用于接口回调后格式化xml数据 npm i xml-js

    PayOrder(b, openid, currip, cb) {
            let nonceStr = common.CreateCode('', 20) //随机字符串
            let out_trade_no = common.CreateCode('WPAY', 20) //支付订单号
            //第一次签名
            let body = this.WePaySign(b, openid, nonceStr, out_trade_no, currip)
            //此处的this.BaseURL=‘https://api.mch.weixin.qq.com/pay/unifiedorder’
            //这是微信旧版统一下单接口
            request({ url: this.BaseURL, method: "POST", body }, (err, response, result) => {
                if (!err && response.statusCode == 200) {
                    //将返回的数据格式化为JSON,再由JSON格式化为JS对象
                    //此处的convert是引入xml-js的别名
                    var result1 = convert.xml2json(result, { compact: true, spaces: 4 });
                    let obj = JSON.parse(result1)
                    let xmlobj = obj.xml
                    //根据文档,通过下面两个值得结果判断是否完成微信统一下单
                    if (xmlobj.return_code._cdata == "SUCCESS" && xmlobj.result_code._cdata == "SUCCESS") {
                        //prepay_id  该参数为统一下单接口返回的关键参数,我们就是要用它完成微信支付
                        let prepay_id = xmlobj.prepay_id._cdata
                        
                        
                        /*
                           以下代码用于在微信小程序中拉起微信支付时使用
                           根据接口要求,需要完成二次签名
                        */
                        
                        let appid = xmlobj.appid._cdata
                        //获取时间戳
                        let timeStamp = parseInt((new Date().getTime() / 1000)) + ''
                        let stringA = `appId=${appid}`
                        stringA += `&nonceStr=${nonceStr.toUpperCase()}`
                        stringA += `&package=${'prepay_id=' + prepay_id}`
                        stringA += `&signType=MD5`
                        stringA += `&timeStamp=${timeStamp}`
                        stringA += '&key=' + common.mch_secret
                        //第二次签名
                        let key = md5(stringA).toUpperCase()
    
                        let data = {
                            key,
                            prepay_id,
                            nonceStr,
                            appid,
                            timeStamp,
                            out_trade_no,
                            package: 'prepay_id=' + prepay_id
                        }
                        cb({ state: 200, flag: true, data })
                    }
    
                } else {
                    cb({ state: 200, flag: false, message: err })
                }
            });
     },
     /**
      * 微信支付下单签名
      */
     WePaySign(b, openid, nonce_str, out_trade_no, currip) {
            //需要将参数封装成XML格式
            let total_fee = b.total * 100   //支付金额,以分为单位
            //拼接签名字符串
            // 此处的body是商品说明,在微信支付完成界面显示
            // notify_url 返回通知URL
            // mch_id 商户号
            let stringA = `appid=${common.appid}&body=微信统一下单测试  &mch_id=${common.mch_id}&nonce_str=${nonce_str}&notify_url=${common.notify_url}&openid=${openid}&out_trade_no=${out_trade_no}&spbill_create_ip=${currip}&total_fee=${total_fee}&trade_type=JSAPI`
            //mch_secret 商户秘钥
            stringA += `&key=${common.mch_secret}`
    
            //生成秘钥
            let key = MD5(stringA).toUpperCase()
    
            let formData = "<xml>"
            formData += "<appid>" + common.appid + "</appid>"
            // formData += "<body>" + JSON.stringify(b) + "</body>"
            formData += "<body>微信统一下单测试</body>"
            formData += "<mch_id>" + common.mch_id + "</mch_id>"
            formData += "<nonce_str>" + nonce_str + "</nonce_str>"
            formData += "<notify_url>" + common.notify_url + "</notify_url>"
            formData += "<openid>" + openid + "</openid>"
            formData += "<out_trade_no>" + out_trade_no + "</out_trade_no>"
            formData += "<sign>" + key + "</sign>"
            formData += "<spbill_create_ip>" + currip + "</spbill_create_ip>"
            formData += "<total_fee>" + total_fee + "</total_fee>"
            formData += "<trade_type>JSAPI</trade_type>"
            formData += "</xml>"
            return formData
    }
    

    1.3 获取统一下单的返回数据,拉起微信支付

    下面是小程序拉起微信支付的代码,具体的格式请大家参考文档
    将下面的的代码粘贴到1.1节点的标识处,也可以单独封装一个方法

    wx.requestPayment({
                appId: obj.appId,
                timeStamp: obj.timeStamp,
                nonceStr: obj.nonceStr,
                package: obj.package,
                signType: 'MD5',
                paySign: obj.key,
                success(e) {
                  //用户支付成功时更新数据库订单信息
                  data = { total, openid: app.globalData.userInfo.openid, orderStr, out_trade_no: obj.out_trade_no }
                  self.UpDateOrder(data)
                },
                fail(err) {
                  console.log('取消支付');
                  self.onLoad()
               }, complete(res) {
    }
    

    四 感悟

    第一次做微信支付,遇到的坑比较多,不过最多的还是签名那一块,两次签名折腾了好久,下面附上微信官方提供的签名校验工具地址
    签名校验工具
    1.第一大坑:一定要注意去空格去回车,否则与官方签名不一致,会导致签名失败。
    2.第二大坑:统一下单接口和拉起微信支付时所用的随机码必须是同一个,同一个。否则统一下单接口之后拉起微信支付会提示签名失败,这一点文档中没说明,本人也是折腾了好一会儿才发现这个坑。
    3.另外线上的小程序IP地址需要https域名,下一节为大家讲述怎么白嫖SSL证书及怎么为Node.js安装SSL证书

    展开全文
  • 微信小程序 转发功能的实现

    万次阅读 2017-11-14 08:44:33
    微信小程序 转发功能的实现 1.当用户将小程序转发到任一群聊之后,可以获取到此次转发的 shareTicket  2.此转发卡片在群聊中被其他用户打开时,可以在 App.onLaunch() 或 App.onShow 获取到另一个 shareTicket ...
  • 微信小程序支付功能详细分析 小记:最近在做微信小程序的支付,中间也遇到了很多问题,总结一下,给大家避个坑,也给自己记录一下后面可以作为参考 概要 本文中只写执行逻辑,跟一些算法,不包含具体代码内容,目前...
  • 五合一收款码在线生成微信小程序版,35个模板 支持微信支付、支付宝支付、手机QQ支付、京东钱包、百度钱包,五合一收款,将其二维码合并为一个二维码,无需手续费,支持qq头像,昵称判断(HTML单页版多模板免安装)
  • 比特币大富翁 Wechat-Lite-App-Damabi 项目简介 比特币大富翁主要是一款模拟比特币交易,展示挖矿、收款、交易、动态百科等功能,在微信里面进行推广...微信公众平台 | 小程序 ECMAScript 6 入门 awesome-wechat-weapp
  • 如何做一个微信小程序商城,怎么开通微信小程序商家  如何制作微信商城小程序?去公众平台用营业执照去注册一个小程序,因为小程序店铺有收款功能,要用到营业执照才可以  由于很多商家企业都不懂代码开发,...
  • 只有企业账号的微信小程序才可以实现微信支付。 自己写的测试账号小程序没有权限 嘤嘤嘤 ┭┮﹏┭┮
  • 注册小程序帐号 在微信公众平台官网首页(mp.weixin.qq.com)点击右上角的“立即注册”按钮。 选择注册的帐号类型 显示了4选项,我们现在是注册小程序,所以选择小程序 填写邮箱和密码 请填写未注册过...
  • 而且,这个解决方式是用小程序来解决,完全不需用下APP,真正地在一款小程序上处理多个小程序客服消息!   一、在没有账号之前,支持抢先体验!选择小程序测试账号登入   二、主界面消息分类,消息测试 ①...
  • 生鲜小程序 微信小程序怎么制作 临沂修齐网络专业制作微信小程序 生鲜小程序开发功能介绍: 1、产品展示:通过扫码或者搜索小程序,用户可以看到不同品种的新鲜蔬菜、水果以及肉类。 2、定时收货:买家可以预约收鲜...
  • 1.首先我们要知道微信企业付款到零钱注意事项:(1)不支持给非实名用户打款;(2)给同一个实名用户付款,单笔单日限额5000/5000元;... 接下来向微信发送请求:调用微信的提现接口地址,传递必要的参...
  • 微信小程序产品定位及功能介绍

    千次阅读 2016-12-28 19:14:52
    微信小程序产品定位及功能介绍,微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。
  • 微信小程序客服消息功能

    千次阅读 2019-08-02 13:40:45
    1.在微信公众平台,开启消息推送,添加配置 2.后台支持说明(https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Service_Center_messages.html) 上面的链接,为官方推荐的链接,个人查看...
  • 申请微信支付需要微信认证,而微信认证不支持个人主体认证,那么就进入死循环了,个人主体类型的微信小程序如何实现小程序支付功能?运维FUN分享解决方法: 个人主体微信小程序支付功能的解决方法 申请微信小程序...
  • ... 使用条件 1、商户号(或同主体其他非服务商商户号)已入驻90日 2、商户号(或同主体其他非服务商商户号)有30天连续正常...3、登录微信支付商户平台-产品中心,开通企业付款。 付款资金 企业付款到零钱资...
  • 微信小程序实现微信支付功能

    万次阅读 热门讨论 2018-03-26 14:54:29
    ,写在博客里做个记录直接把里面的参数替换成你的就可以了,前提是你要开通的有微信支付功能,需要商户号,appid,appsecret,openid,openid的获取比较简单,我再写一篇博客做介绍,不懂得可以私聊我//小程序端代码...
  • 说到小程序自动语音播报功能,不得不提到官方的一款小程序收款小账本”,当收到一笔款后,就能语音提醒。 这是在收款小程序的应用,再举2个例子! ▍外卖 店家做了一个简单的外卖小程序,一来尝试互联网...
  • 微信小程序支付

    2021-09-13 11:13:00
    微信小程序支付 ** 直接上代码 wx.request({ url: 'https://xxxxxxxxx.com/api/xxxxy/createOrderWx', //后台拉取支付的接口 method: "POST", data: { reqkey: '12345678', //小程序微信公众平台配置的
  • 微信小程序

    千次阅读 2017-04-24 15:19:04
    产品定位及功能介绍微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。小程序注册注册小程序帐号 在微信公众平台官网首页(mp.weixin.qq.com)点击右上角的...
  • 事前准备 1.准备必要的参数 appid:不多说,懂的自然动 session_key:会话密钥 商户id:直接找公司的要 商户API密钥:直接要(需要安装证书,和财付通插件),登录商户平台一目了然,不清楚下边有流程 ...
  • 微信支付宝个人收款第三方收款程序

    千次阅读 热门讨论 2018-10-06 13:14:07
    微信支付宝个人收款第三方收款程序,完美解决微信扫码异地频繁问题 测试地址:通道测试 微信收款采用群收款模式,解决早前异地扫码,收款频繁问题 支付宝支持固码模式,秒出码 ios苹果机器免越狱运行,稳定,高效 微信...
  • 微信小程序调用微信支付接口

    万次阅读 多人点赞 2018-07-06 15:13:42
    前言:应项目要求,需要使用微信小程序做支付,写完后告知手续费太高方案不予通过(宝宝心里苦,但宝宝不说)。此次开发在因站在巨人的肩膀上顺利完成。 微信支付文档传送门:...
  • ipad协议微信小程序授权一般可以获取用户的openid、昵称、头像、用户所在省和市、性别等功能。 微信ipad协议源码,可实现微信80%功能,支持62数据登录,扫码登录,收发朋友圈,查看朋友圈,微信建群,微信拉人进群,微信...
  • 微信小程序怎么样取代传统收款设备的指引,在 传统的收款结算中,商家使用计算器计算好金额或使用特定的收款设备计算金额后,用户一般扫码商家的微信收款码输入金额支付完成交易,或让商家收款设备扫码自己的微信...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,296
精华内容 918
关键字:

微信小程序收款功能

微信小程序 订阅