精华内容
下载资源
问答
  • 最近在做微信公众号支付,看文档做的,感觉踩了不少坑,为了避免后人采坑,所以写下此demo----微信支付功能实现(微信公众号支付)
  • unity接入支付功能

    2018-03-07 18:48:29
    unity接入支付功能;unity接入支付功能unity接入支付功能
  • 该代码资源包,用于springboot进行配置微信小程序支付功能,订单生成,退款,提现等功能,只需要更改基本的参数设置,欢迎大家下载!
  • uniapp实现支付功能

    万次阅读 多人点赞 2019-11-11 16:31:52
    uniapp实现支付功能 详细参考: https://gitee.com/copperpeas/uniapp-payment uniapp-payment 介绍 uniapp支付 微信支付流程 测试接入的是uniapp官方预下单接口 APP应用首先去微信等开发平台申请开通支付,部分支付...

    uniapp实现支付功能
    详细参考:
    https://gitee.com/copperpeas/uniapp-payment

    uniapp-payment
    介绍
    uniapp支付

    微信支付流程
    测试接入的是uniapp官方预下单接口

    APP应用首先去微信等开发平台申请开通支付,部分支付渠道需要配置支付目录,授权域名,回调函数

    预下单返回参考:

    "data": {
        "appid": "wx0411fa6a39d61297",
        "noncestr": "Xu70l0bOQSQIDIPH",
        "package": "Sign=WXPay",
        "partnerid": "1230636401",
        "prepayid": "wx271034552844601252843eae1384334800",
        "timestamp": 1569551695,
        "sign": "44B127098800419D542B688054F95A8F"
      },
    

    参考官方微信支付 https://pay.weixin.qq.com/wiki/doc/api/index.html

    小程序支付:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1

    简单流程: 第一步:调用登录接口,获取到用户的openid等 第二步:Code,价格等发送给后台,后台发送微信生成预支付订单,并且返回订单信息 第三步:小程序拿到预下单订单信息,发起支付,调起支付APP 第四步:后台验证支付结果

    小程序第三步调起支付给APP调起支付参数不一样,大体流程是一致的

    商户系统和微信支付系统主要交互:

    1、小程序内调用登录接口,获取到用户的openid,api参见公共api【小程序登录API】

    2、商户server调用支付统一下单,api参见公共api【统一下单API】

    3、商户server调用再次签名,api参见公共api【再次签名】

    4、商户server接收支付通知,api参见公共api【支付结果通知API】

    5、商户server查询支付结果,api参见公共api【查询订单API】

    拿到预下单后调用支付

    uni.requestPayment({
        timeStamp: paymentData.timeStamp,
        nonceStr: paymentData.nonceStr,
        package: paymentData.package,
        signType: 'MD5',
        paySign: paymentData.paySign,
        success: (res) => {
            uni.showToast({
                title: "感谢您的赞助!"
            })
        },
        fail: (res) => {
            uni.showModal({
                content: "支付失败,原因为: " + res
                    .errMsg,
                showCancel: false
            })
        },
        complete: () => {
            this.loading = false;
        }
    })
    

    APP支付 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3

    简单流程:

    第一步:获取支付类型,APPid,支付金额 第二步:发送给后台,后台发送微信生成预支付订单,并且返回订单信息 第三步:拿到预下单订单信息,发起支付,调起支付APP 第四步:后台验证支付结果

    商户系统和微信支付系统主要交互说明:

    步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

    步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。

    步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay

    步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】

    步骤5:商户后台接收支付通知。api参见【支付结果通知API】

    步骤6:商户后台查询支付结果。api参见【查询订单API】

    拿到预下单后调用支付

    uni.requestPayment({
        provider: e.id,
        orderInfo: orderInfo.data,
        success: (e) => {
            console.log("success", e);
            uni.showToast({
                title: "感谢您的赞助!"
            })
        },
        fail: (e) => {
            console.log("fail", e);
            uni.showModal({
                content: "支付失败,原因为: " + e.errMsg,
                showCancel: false
            })
        },
        complete: () => {
            this.providerList[index].loading = false;
        }
    })
    

    微信有预下单,而支付宝不存在

    支付宝支付流程
    支付宝支付参考 https://docs.open.alipay.com/ 左边支付栏目 支付宝APP支付 https://docs.open.alipay.com/204/105297

    简单流程:
    第一步:获取支付类型,APPid,支付金额
    第二步:发送给后台,后台针对支付宝请求参数说明,组装数据,返回订单信息
    第三步:拿到组装单订单信息,发起支付,调起支付APP
    第四步:后台验证支付结果

    在这里插入图片描述

    展开全文
  • 安卓快速集成支付功能,个人开发者的福音...
  • 支付功能怎么测试?

    千次阅读 2021-03-17 15:42:12
    跳槽高峰期,作为测试,不管是面试还是笔试,...今天这篇文章,我就很多同学都觉得难的一个问题“支付功能”作为案例,一起来分析一下如何回答这类的面试题。 测试思维 要分析测试点之前,我们先来梳理一下测试思维。总

    跳槽高峰期,作为测试,不管是面试还是笔试,必然要被考验到的就是”测试思维“。在面试中就是体现在如下面试题中:

    “说说你项目中的 xx 模块你是如何测试的?”

    “给你一个购物车,你要怎么测试?”

    “你说一下这个产品的登录功能有哪些测试点?”

    “支付功能怎么测试?”

    所有的这些问题其实都是在考察你的测试思维。我们再回答这类问题的时候有方法可依循的。

    今天这篇文章,我就很多同学都觉得难的一个问题“支付功能”作为案例,一起来分析一下如何回答这类的面试题。

    测试思维

    要分析测试点之前,我们先来梳理一下测试思维。总结来说,任何事物的测试思路都可以总结如下:

    • 第一步:梳理产品的核心业务流程:明白这是个什么项目,实现了什么业务,以及是怎么实现的?

    这个步骤一般是参考公司的需求文档来的,如果产品提供需求文档的同时提供了业务流程图,可以遵循流程图来梳理;如果产品没有提供流程图,就需要测试人员根据需求的理解自己画出流程图,达到梳理业务的目的。

    • 第二步:根据流程进行模块细分,然后针对每个功能模块进行详细的测试点设计和提取。

    这个单个功能的测试点提取要覆盖一下几个方面:

    正常功能验证:优先覆盖正常的业务流程和功能验证,这其实也是单个功能的冒烟测试。冒烟测试先行,如果不通过,可以直接停止测试等开发修复后继续测试。

    异常功能验证:为了更加贴近用户的使用产经,我们也要验证各种异常的场景,故意操作导致出错,检查系统的反馈和提示,保证用户操作失误的情况能够得到系统的友好指示。

    因为有很多地方的操作都有可能会导致系统异常和抛错,所以为了不漏测,我们需要找出所有可能导致异常的输入项和选项。所以就到了第三步:

    • 第三步:针对具体功能,寻找每个输入项和步骤,从以下三个角度来分析测试点 。

    长度,数据类型,必填项,重复

    需求的约束条件 + 隐形需求

    功能之间的交互

    这其中就需要用到一些用例的具体设计方法了,比如场景法,等价类法,边界值法,错误推测法等等

    • 第四步:考虑非功能测试点,包括界面、易用性、兼容性、安全性、性能压力

    支付功能的测试点

    基于上面的测试思路,我们可以分析得出“支付功能”测试点如下:

    一、梳理支付的业务流程如下:

    点击支付—> 选择支付方式 —> 确认金额—> 输入密码 —> 成功支付

    完成这个流程测试,也就是完成了项目的冒烟测试!然后需要测试针对流程中的每个阶段和步骤,具体分析可能导致异常的测试点,所以我们按阶段和输入项来进行划分如下:

    1)点击支付,提交订单但是取消了,检查可以取消成功

    2)选择支付方式:

    正常:可以支持的支付方式有:信用卡,储蓄卡,网银支付,余额,第三方支付(微信,支付宝,京东、百度、聚合支付、组合支付),找人代付,验证是否支持并且可以正常选择并支付;

    异常: 没有绑定任何的支付方式时,支付报错。

    **功能交互:**支付时结合优惠券/折扣券/促销价抵扣进行相关的抵扣,验证规则正确,并且可以正常抵扣和支付。

    3)确认支付金额:这个步骤可以用到等价类和边界值的用例设计方法

    正常:正常金额里用边界值法去测试点:

    最大支付金额(单日最大,单笔最大,余额最大)

    最小支付金额

    异常:同样也用边界值方法提取测试点:

    超过支付方式单日最大消费金额/单笔最大/余额最大

    异常金额支付:非数字、负数、0,小数点超过 2 位等

    4)支付密码:

    正常:可以支持的支付密码类型有:指纹,人脸识别,账号密码,动态获取验证码,手势,信用卡和支付码,小额免密等,确认自己的产品所支持的密码类型,确认可以验证并支付成功;

    异常:输入错误的密码,检查有无提示信息且正确;超过密码错误上限,检查是否冻结等。

    5)其他场景测试点:

    a、多笔订单合并支付,是否可以成功;

    b、重复点击支付按钮,是否会出现多次购买,并同步检查数据库的数据帐账目正确;

    c、支付中断:

    主动中断:可以继续支付并成功

    被动中断:比如电话、低电量、闹钟,断网、切换后台、耳机插拔等,验证可以继续支付;

    d、网络测试:

    验证各种网络类型:2G、3G, 4G,5G,wifi 下都可以正常支付;

    进行网络切换,支付功能正常;

    弱网测试下支付功能正常:不会重复支付多次,APP 不会闪退 崩溃,而且页面提示友好;

    e、使用 fiddler 等抓包篡改价格:不允许抓包或者数据加密,篡改不成功

    二、退款流程

    **正常:**验证正常的退款流程,也就是退款的冒烟测试:

    1、点击退款可以退款成功,并且检查交易状态是退款,退款金额可以到账;

    2、结合优惠券等抵扣,可以退款实际支付金额;

    3、同步检查数据库的数据和账目是正确的;

    异常:提交错误退款(退款订单号不对),或者退款金额错误,都能够退款失败(此处一般会借助工具进行测试,比如进行接口测试);

    三、测试方法

    那么以上的测试点在具体公司项目中要怎么进行测试呢?我们有不同的一些测试方法:

    1) 小额支付:

    需要让开发修改代码,不管支付多少钱,实际支付都是 1 分钱;不顾这种方法只能测试小额支付,就有可能会出现产品小额支付没问题,但是大额支付就错误的漏测情况;

    2)申请测试金额:

    这种方式一般会作为小额支付的一种补充,比如测试完小额支付后,再测试一些大额支付,这就需要跟公司申请测试基金,走报销流程;

    3)沙箱支付:

    沙箱支付是一种虚拟的支付,不是真实的金额;这种方法可以验证小额和大额的支付流程;不过目前只有支付宝沙箱比较成熟可用,其他的支付方法不可用。

    四、非功能测试点

    测试完以上的功能测试点之后,我们还需要验证一些非功能测试点,主要包括以下几个方面:

    1)界面

    验证界面的美观,排版和错别字等。

    2)兼容性

    **BS:**如果是 BS 架构的产品,需要测试跟浏览器的兼容性;所以就需要根据浏览器的内核,选择一些主流的浏览器进行测试;

    CS:如果 CS 架构的产品,测试手机移动端的兼容,比如手机型号,系统版本和屏幕大小及分辨率等。

    3)易用性

    测试站在用户的角度考虑用户体验,使用是否方便等。

    4)性能

    比如考虑多用户支付,长时间运行等,关注产品的响应时间等,一般需要借助工具或者代码进行测试。

    5)安全

    验证敏感信息是否加密,是否可以篡改;通过一些工具进行安全扫描,检查是否有安全漏洞;或者采用一些其他的手段进行专门的安全测试。

    展开全文
  • 在线支付功能实现代码

    万次阅读 2018-01-30 13:22:08
    我们都知道,在现在的网站中,基本上都会有支付功能,在线支付作为一个潮流已是现代化网站的必备功能模块,那么几天我就分享一下如果来做这个在线支付功能。 在线支付一般来说有两种实现方式,一种是调用各个银行...

    我们都知道,在现在的网站中,基本上都会有支付功能,在线支付作为一个潮流已是现代化网站的必备功能模块,那么几天我就分享一下如果来做这个在线支付功能。

    在线支付一般来说有两种实现方式,一种是调用各个银行提供的接口,另一种是使用第三方集成好的支付功能。两种方式各有优劣,这个相信行内人士都是非常了解的了。对于第三方支付来说会需要提交企业5证来验证,还会有部分手续费,但是实现起来就非常方便了。对于直接使用银联接口的话就是使用起来必来麻烦,要为各个银行写接口实现,但是相比起来就更加安全了。


    本文主要讲的是使用第三方支付平台来整合到我们的项目中,实现实际的支付功能。本文使用的例程是一个真实的支付过程,请注意,不要再测试中支付过多金额,否则后果自负。以前文说到的一个网上书店系统来说明,这里接入的是易宝支付的测试指纹和接口。如实际企业开发者可以使用企业牌照申请接口,如是普通开发者用来测试在线支付功能的可以直接使用。


    我们先来说应该如何生成订单。

    一、数据库设计

    我们需要来一个订单表,订单详情表,以及订单的自动化序列表

    [sql]  view plain  copy
    1. --订单表  
    2. create table orders(  
    3.     ordernum varchar(100) primary key,  
    4.     price float(8,2),  
    5.     number int,  
    6.     status int,   --支付成功状态位会改变  
    7.     customerId VARCHAR(100),  
    8.     CONSTRAINT customerId_fk FOREIGN KEY (customerId) REFERENCES customers(id)    
    9. )  
    10. )  
    11.   
    12. --订单详情表  
    13. create table orderitems(  
    14.     id varchar(100) primary key,  
    15.     number int,  
    16.     price float(8,2),  
    17.     ordernum varchar(100),  
    18.     bookid varchar(100),  
    19.     CONSTRAINT ordernum_fk FOREIGN KEY (ordernum) REFERENCES orders(ordernum),  
    20.     CONSTRAINT bookid_fk FOREIGN KEY (bookid) REFERENCES books(id)      
    21. )  
    22.   
    23. --订单编号表  
    24. create table ordernum(  
    25.     prefix date,  
    26.     num int   
    27. )  

    二、bean设计

    生成其get,set方法,并且记得要序列化Serializable

    [java]  view plain  copy
    1. private String ordernum;  
    2.     private float price;  
    3.     private int number;  
    4.     private int status;  


    三、接口设计

    设计订单的实体类

    [java]  view plain  copy
    1. public interface OrderDao {  
    2.   
    3.     void save(Order order);  
    4.   
    5.     Order findByNum(String ordernum);  
    6.   
    7.     void update(Order order);  
    8.   
    9.     //订单号降序排序  
    10.     List<Order> findByCustomerId(String customerId);  
    11.   
    12.       
    13.     List<OrderItem> findOrderItem(String ordernum);  
    14.   
    15. }  

    接口的实现

    [java]  view plain  copy
    1. public class OrderDaoImpl implements OrderDao {  
    2.   
    3.     private QueryRunner qr=new QueryRunner(C3P0Util.getDataSource());  
    4.       
    5.     //保存订单  
    6.     @Override  
    7.     public void save(Order order) {  
    8.           
    9.         try {  
    10.             qr.update("insert into orders (ordernum,price,number,status,customerId) values (?,?,?,?,?)",   
    11.                     order.getOrdernum(),order.getPrice(),order.getNumber(),order.getStatus(),  
    12.                     order.getCustomer()==null?null:order.getCustomer().getId());  
    13.             List<OrderItem> items = order.getItems();  
    14.             for(OrderItem item:items){  
    15.                 qr.update("insert into orderitems (id,number,price,ordernum,bookid) values (?,?,?,?,?)",   
    16.                         item.getId(),item.getNumber(),item.getPrice(),order.getOrdernum(),item.getBook()==null?null:item.getBook().getId());  
    17.             }  
    18.         } catch (SQLException e) {  
    19.             throw new RuntimeException(e);  
    20.         }  
    21.     }  
    22.   
    23.   
    24.     public Order findByNum(String ordernum) {  
    25.         try {  
    26.             Order order = qr.query("select * from orders where ordernum=?"new BeanHandler<Order>(Order.class), ordernum);  
    27.             if(order!=null){  
    28.                 Customer customer = qr.query("select * from customers where id=(select customerId from orders where ordernum=?)"new BeanHandler<Customer>(Customer.class), ordernum);  
    29.                 order.setCustomer(customer);  
    30.             }  
    31.             return order;  
    32.         } catch (SQLException e) {  
    33.             throw new RuntimeException(e);  
    34.         }  
    35.     }  
    36.     public void update(Order order) {  
    37.         try {  
    38.             qr.update("update orders set price=?,number=?,status=? where ordernum=?", order.getPrice(),order.getNumber(),order.getStatus(),order.getOrdernum());  
    39.         } catch (SQLException e) {  
    40.             throw new RuntimeException(e);  
    41.         }  
    42.     }  
    43.   
    44.   
    45.     @Override  
    46.     public List<Order> findByCustomerId(String customerId) {  
    47.         try {  
    48.             List<Order> orders=qr.query("select * from orders where customerId=?  order by ordernum desc "new BeanListHandler<Order>(Order.class),customerId);  
    49.             if(orders!=null){  
    50.                 Customer customer=qr.query("select * from customers where id=? ",new BeanHandler<Customer>(Customer.class),customerId);  
    51.                 for (Order order : orders) {  
    52.                     order.setCustomer(customer);  
    53.                 }  
    54.             }  
    55.             return orders;  
    56.         } catch (SQLException e) {  
    57.             throw new RuntimeException(e);  
    58.         }  
    59.     }  
    60.   
    61.   
    62.     @Override  
    63.     public List<OrderItem> findOrderItem(String ordernum) {  
    64.           
    65.         try {  
    66.             List<OrderItem> items = qr.query("select * from orderitems where ordernum=?"new BeanListHandler<OrderItem>(OrderItem.class), ordernum);  
    67.             if(items!=null){  
    68.                 for(OrderItem o:items){  
    69.                     Book book = qr.query("select * from books where id=(select bookId from orderitems where id=?)"new BeanHandler<Book>(Book.class), o.getId());  
    70.                     o.setBook(book);  
    71.                 }  
    72.             }  
    73.             return items;  
    74.         } catch (SQLException e) {  
    75.             throw new RuntimeException(e);  
    76.         }  
    77.     }  
    78. }  

    四、Service的设计


    [java]  view plain  copy
    1. //生成订单  
    2.     void genOrder(Order order);  
    3.   
    4.     //根据订单号查找订单  
    5.     Order findOrderByNum(String ordernum);  
    6.   
    7.     //更新订单信息  
    8.     void updateOrder(Order order);  
    9.       
    10.     //更新订单状态  
    11.     void changeOrderStatus(int status,String ordernum);  
    12.   
    13.     //  
    14.     List<Order> findOrdersByCustomerId(String customerId);  
    15.       
    16.     List<OrderItem> findOrderItemByCustomerId(String ordernum);  


    实现其接口

    [java]  view plain  copy
    1. //生成订单  
    2.     @Override  
    3.     public void genOrder(Order order) {  
    4.         if(order==null)  
    5.                 throw new RuntimeException("订单不能为空");  
    6.         if(order.getCustomer()==null)  
    7.             throw new RuntimeException("订单的客户不能为空");  
    8.         orderDao.save(order);  
    9.           
    10.     }  
    11.   
    12.     @Override  
    13.     public Order findOrderByNum(String ordernum) {  
    14.           
    15.         return orderDao.findByNum(ordernum);  
    16.     }  
    17.   
    18.     @Override  
    19.     public void updateOrder(Order order) {  
    20.         orderDao.update(order);  
    21.           
    22.     }  
    23.   
    24.     @Override  
    25.     public void changeOrderStatus(int status, String ordernum) {  
    26.         Order order=findOrderByNum(ordernum);  
    27.         order.setStatus(status);  
    28.         updateOrder(order);  
    29.     }  
    30.   
    31.     @Override  
    32.     public List<Order> findOrdersByCustomerId(String customerId) {  
    33.           
    34.         return orderDao.findByCustomerId(customerId);  
    35.     }  
    36.   
    37.     @Override  
    38.     public List<OrderItem> findOrderItemByCustomerId(String ordernum) {  
    39.       
    40.         return orderDao.findOrderItem(ordernum);  
    41.     }  



    生成订单


    [java]  view plain  copy
    1. //订单详情  
    2.     private void showOrders(HttpServletRequest request,  
    3.             HttpServletResponse response) throws IOException, ServletException {  
    4.         //检测是否登录;   
    5.                 HttpSession session=request.getSession();  
    6.                 Customer customer=(Customer) session.getAttribute("customer");  
    7.                 if(customer==null){  
    8.                     response.getWriter().write("请先登录");  
    9.                     response.setHeader("Refresh""2;URL="+request.getContextPath());  
    10.                     return ;  
    11.                 }  
    12.             List<Order>  orders=s.findOrdersByCustomerId(customer.getId());  
    13.             request.setAttribute("orders", orders);  
    14.               
    15.             request.getRequestDispatcher("/listOrders.jsp").forward(request, response);  
    16.                   
    17.                   
    18.           
    19.     }  
    20.   
    21.   
    22.     //生成订单  
    23.     private void genOrder(HttpServletRequest request,  
    24.             HttpServletResponse response) throws IOException, ServletException  {  
    25.         //检测是否登录;   
    26.         HttpSession session=request.getSession();  
    27.         Customer customer=(Customer) session.getAttribute("customer");  
    28.         if(customer==null){  
    29.             response.getWriter().write("请先登录");  
    30.             response.setHeader("Refresh""2;URL="+request.getContextPath());  
    31.             return ;  
    32.         }  
    33.           
    34.         Cart cart=(Cart) request.getSession().getAttribute("cart");  
    35.           
    36.         Order order=new Order();  
    37.         order.setOrdernum(OrderNumUtil.genOrderNum());  
    38.         order.setPrice(cart.getPrice());  
    39.         order.setNumber(cart.getNumber());  
    40.         order.setCustomer(customer);  
    41.           
    42.           
    43.         List<OrderItem>  oItems=new ArrayList<OrderItem>();  
    44.         //设置订单项  
    45.         for(Map.Entry<String, CartItem>  me:cart.getItems().entrySet()){  
    46.             OrderItem item=new OrderItem();  
    47.             item.setId(UUID.randomUUID().toString());  
    48.             item.setNumber(me.getValue().getNumber());  
    49.             item.setPrice(me.getValue().getPrice());  
    50.             item.setBook(me.getValue().getBook());  
    51.             oItems.add(item);  
    52.         }  
    53.         //建立和订单的关系  
    54.         order.setItems(oItems);  
    55.         s.genOrder(order);  
    56.         request.setAttribute("order", order);  
    57.         request.getRequestDispatcher("/pay.jsp").forward(request, response);  
    58.           
    59.           
    60.     }  




    接下来就是支付功能的实现了。我们要为上面生成的订单来支付

    五、界面设计。

    订单生成后腰跳转过去支付,这个支付界面我们可以使用一个表单。pay.jsp。并且将内容提交到PayServlet中。



    [java]  view plain  copy
    1. <form action="${pageContext.request.contextPath}/servlet/PayServlet" method="post">  
    2.         <table width="60%">  
    3.             <tr>  
    4.                 <td bgcolor="#F7FEFF" colspan="4">  
    5.                 订单号:<INPUT TYPE="text" NAME="ordernum" value="${order.ordernum}${param.ordernum}"  readonly="readonly">   
    6.                 支付金额:<INPUT TYPE="text" NAME="money" size="6" value="${order.price }"  readonly="readonly">元</td>  
    7.             </tr>  
    8.             <tr>  
    9.                 <td><br />  
    10.                 </td>  
    11.             </tr>  
    12.             <tr>  
    13.                 <td>请您选择在线支付银行</td>  
    14.             </tr>  
    15.             <tr>  
    16.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="CMBCHINA-NET">招商银行  
    17.                 </td>  
    18.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="ICBC-NET">工商银行</td>  
    19.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="ABC-NET">农业银行</td>  
    20.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="CCB-NET">建设银行  
    21.                 </td>  
    22.             </tr>  
    23.             <tr>  
    24.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="CMBC-NET">中国民生银行总行</td>  
    25.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="CEB-NET">光大银行  
    26.                 </td>  
    27.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="BOCO-NET">交通银行</td>  
    28.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="SDB-NET">深圳发展银行</td>  
    29.             </tr>  
    30.             <tr>  
    31.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="BCCB-NET">北京银行</td>  
    32.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="CIB-NET">兴业银行  
    33.                 </td>  
    34.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="SPDB-NET">上海浦东发展银行  
    35.                 </td>  
    36.                 <td><INPUT TYPE="radio" NAME="pd_FrpId" value="ECITIC-NET">中信银行</td>  
    37.             </tr>  
    38.             <tr>  
    39.                 <td><br />  
    40.                 </td>  
    41.             </tr>  
    42.             <tr>  
    43.                 <td><INPUT TYPE="submit" value="确定支付">  
    44.                 </td>  
    45.             </tr>  
    46.         </table>  
    47.     </form>  


    六、servletc逻辑处理

    对于使用易宝支付我们无需导入jar包,我们直接使用其接口即可。下面这张图片是易宝支付的接口说明。




    PayServlet的内容。

    这里值得说一下的就是  p8_Url ,也就是支付成功后悔返回的商家界面地址。我这里写的是自己工程的地址。

    [java]  view plain  copy
    1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
    2.             throws ServletException, IOException {  
    3.   
    4.         request.setCharacterEncoding("UTF-8");  
    5.         String ordernum=request.getParameter("ordernum");  
    6.         String money=request.getParameter("money");  
    7.         String pd_FrpId=request.getParameter("pd_FrpId");  
    8.           
    9.           
    10.           
    11.         String p0_Cmd = "Buy";  
    12.         String p1_MerId = "10001126856";  
    13.         String p2_Order = ordernum;  
    14.         String p3_Amt = money;  
    15.         String p4_Cur = "CNY";  
    16.         String p5_Pid = "books";  //商品名称  
    17.         String p6_Pcat = "unknown";  
    18.         String p7_Pdesc = "descrition";  
    19.         String p8_Url = "http://localhost:8080"+request.getContextPath()+"/servlet/ResponsePayServlet";  
    20.         String p9_SAF = "1";  
    21.         String pa_MP = "unknown";  
    22.         String pr_NeedResponse="1";   
    23.         String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order, p3_Amt, p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP, pd_FrpId, pr_NeedResponse, "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl");  
    24.           
    25.         request.setAttribute("p0_Cmd",p0_Cmd );  
    26.         request.setAttribute("p1_MerId",p1_MerId );  
    27.         request.setAttribute("p2_Order", p2_Order);  
    28.         request.setAttribute("p3_Amt", p3_Amt);  
    29.         request.setAttribute("p4_Cur",p4_Cur );  
    30.         request.setAttribute("p5_Pid",p5_Pid );  
    31.         request.setAttribute("p6_Pcat",p6_Pcat );  
    32.         request.setAttribute("p7_Pdesc",p7_Pdesc );  
    33.         request.setAttribute("p8_Url",p8_Url );  
    34.         request.setAttribute("pa_MP",pa_MP );  
    35.         request.setAttribute("pr_NeedResponse",pr_NeedResponse );  
    36.         request.setAttribute("hmac",hmac );  
    37.         request.setAttribute("p9_SAF",p9_SAF );  
    38.         request.setAttribute("pd_FrpId", pd_FrpId);  
    39.           
    40.         request.getRequestDispatcher("/sure.jsp").forward(request, response);  
    41.       
    42.     }  

    PayUtil.java是一个工具类,这里我们直接使用官方的即可。

    [java]  view plain  copy
    1. public class PaymentUtil {  
    2.   
    3. private static String encodingCharset = "UTF-8";  
    4.       
    5.     /** 
    6.      * 生成hmac方法 
    7.      *  
    8.      * @param p0_Cmd 业务类型 
    9.      * @param p1_MerId 商户编号 
    10.      * @param p2_Order 商户订单号 
    11.      * @param p3_Amt 支付金额 
    12.      * @param p4_Cur 交易币种 
    13.      * @param p5_Pid 商品名称 
    14.      * @param p6_Pcat 商品种类 
    15.      * @param p7_Pdesc 商品描述 
    16.      * @param p8_Url 商户接收支付成功数据的地址 
    17.      * @param p9_SAF 送货地址 
    18.      * @param pa_MP 商户扩展信息 
    19.      * @param pd_FrpId 银行编码 
    20.      * @param pr_NeedResponse 应答机制 
    21.      * @param keyValue 商户密钥 
    22.      * @return 
    23.      */  
    24.     public static String buildHmac(String p0_Cmd,String p1_MerId,  
    25.             String p2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,  
    26.             String p7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,  
    27.             String pr_NeedResponse,String keyValue) {  
    28.         StringBuilder sValue = new StringBuilder();  
    29.         // 业务类型  
    30.         sValue.append(p0_Cmd);  
    31.         // 商户编号  
    32.         sValue.append(p1_MerId);  
    33.         // 商户订单号  
    34.         sValue.append(p2_Order);  
    35.         // 支付金额  
    36.         sValue.append(p3_Amt);  
    37.         // 交易币种  
    38.         sValue.append(p4_Cur);  
    39.         // 商品名称  
    40.         sValue.append(p5_Pid);  
    41.         // 商品种类  
    42.         sValue.append(p6_Pcat);  
    43.         // 商品描述  
    44.         sValue.append(p7_Pdesc);  
    45.         // 商户接收支付成功数据的地址  
    46.         sValue.append(p8_Url);  
    47.         // 送货地址  
    48.         sValue.append(p9_SAF);  
    49.         // 商户扩展信息  
    50.         sValue.append(pa_MP);  
    51.         // 银行编码  
    52.         sValue.append(pd_FrpId);  
    53.         // 应答机制  
    54.         sValue.append(pr_NeedResponse);  
    55.           
    56.         return PaymentUtil.hmacSign(sValue.toString(), keyValue);  
    57.     }  
    58.       
    59.     /** 
    60.      * 返回校验hmac方法 
    61.      *  
    62.      * @param hmac 支付网关发来的加密验证码 
    63.      * @param p1_MerId 商户编号 
    64.      * @param r0_Cmd 业务类型 
    65.      * @param r1_Code 支付结果 
    66.      * @param r2_TrxId 易宝支付交易流水号 
    67.      * @param r3_Amt 支付金额 
    68.      * @param r4_Cur 交易币种 
    69.      * @param r5_Pid 商品名称 
    70.      * @param r6_Order 商户订单号 
    71.      * @param r7_Uid 易宝支付会员ID 
    72.      * @param r8_MP 商户扩展信息 
    73.      * @param r9_BType 交易结果返回类型 
    74.      * @param keyValue 密钥 
    75.      * @return 
    76.      */  
    77.     public static boolean verifyCallback(String hmac, String p1_MerId,  
    78.             String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,  
    79.             String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,  
    80.             String r8_MP, String r9_BType, String keyValue) {  
    81.         StringBuilder sValue = new StringBuilder();  
    82.         // 商户编号  
    83.         sValue.append(p1_MerId);  
    84.         // 业务类型  
    85.         sValue.append(r0_Cmd);  
    86.         // 支付结果  
    87.         sValue.append(r1_Code);  
    88.         // 易宝支付交易流水号  
    89.         sValue.append(r2_TrxId);  
    90.         // 支付金额  
    91.         sValue.append(r3_Amt);  
    92.         // 交易币种  
    93.         sValue.append(r4_Cur);  
    94.         // 商品名称  
    95.         sValue.append(r5_Pid);  
    96.         // 商户订单号  
    97.         sValue.append(r6_Order);  
    98.         // 易宝支付会员ID  
    99.         sValue.append(r7_Uid);  
    100.         // 商户扩展信息  
    101.         sValue.append(r8_MP);  
    102.         // 交易结果返回类型  
    103.         sValue.append(r9_BType);  
    104.         String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);  
    105.         return sNewString.equals(hmac);  
    106.     }  
    107.       
    108.     /** 
    109.      * @param aValue 
    110.      * @param aKey 
    111.      * @return 
    112.      */  
    113.     public static String hmacSign(String aValue, String aKey) {  
    114.         byte k_ipad[] = new byte[64];  
    115.         byte k_opad[] = new byte[64];  
    116.         byte keyb[];  
    117.         byte value[];  
    118.         try {  
    119.             keyb = aKey.getBytes(encodingCharset);  
    120.             value = aValue.getBytes(encodingCharset);  
    121.         } catch (UnsupportedEncodingException e) {  
    122.             keyb = aKey.getBytes();  
    123.             value = aValue.getBytes();  
    124.         }  
    125.   
    126.         Arrays.fill(k_ipad, keyb.length, 64, (byte54);  
    127.         Arrays.fill(k_opad, keyb.length, 64, (byte92);  
    128.         for (int i = 0; i < keyb.length; i++) {  
    129.             k_ipad[i] = (byte) (keyb[i] ^ 0x36);  
    130.             k_opad[i] = (byte) (keyb[i] ^ 0x5c);  
    131.         }  
    132.   
    133.         MessageDigest md = null;  
    134.         try {  
    135.             md = MessageDigest.getInstance("MD5");  
    136.         } catch (NoSuchAlgorithmException e) {  
    137.   
    138.             return null;  
    139.         }  
    140.         md.update(k_ipad);  
    141.         md.update(value);  
    142.         byte dg[] = md.digest();  
    143.         md.reset();  
    144.         md.update(k_opad);  
    145.         md.update(dg, 016);  
    146.         dg = md.digest();  
    147.         return toHex(dg);  
    148.     }  
    149.   
    150.     public static String toHex(byte input[]) {  
    151.         if (input == null)  
    152.             return null;  
    153.         StringBuffer output = new StringBuffer(input.length * 2);  
    154.         for (int i = 0; i < input.length; i++) {  
    155.             int current = input[i] & 0xff;  
    156.             if (current < 16)  
    157.                 output.append("0");  
    158.             output.append(Integer.toString(current, 16));  
    159.         }  
    160.   
    161.         return output.toString();  
    162.     }  
    163.   
    164.     /** 
    165.      *  
    166.      * @param args 
    167.      * @param key 
    168.      * @return 
    169.      */  
    170.     public static String getHmac(String[] args, String key) {  
    171.         if (args == null || args.length == 0) {  
    172.             return (null);  
    173.         }  
    174.         StringBuffer str = new StringBuffer();  
    175.         for (int i = 0; i < args.length; i++) {  
    176.             str.append(args[i]);  
    177.         }  
    178.         return (hmacSign(str.toString(), key));  
    179.     }  
    180.   
    181.     /** 
    182.      * @param aValue 
    183.      * @return 
    184.      */  
    185.     public static String digest(String aValue) {  
    186.         aValue = aValue.trim();  
    187.         byte value[];  
    188.         try {  
    189.             value = aValue.getBytes(encodingCharset);  
    190.         } catch (UnsupportedEncodingException e) {  
    191.             value = aValue.getBytes();  
    192.         }  
    193.         MessageDigest md = null;  
    194.         try {  
    195.             md = MessageDigest.getInstance("SHA");  
    196.         } catch (NoSuchAlgorithmException e) {  
    197.             e.printStackTrace();  
    198.             return null;  
    199.         }  
    200.         return toHex(md.digest(value));  
    201.   
    202.     }  
    203.   
    204.       
    205. }  


    对于支付成功之后,我们需要修改我们的订单状态,改为已付款,所以我们需要一个响应的servlet

    [java]  view plain  copy
    1. public class ResponsePayServlet extends HttpServlet {  
    2.   
    3.   
    4.     private BusinessService s=new BusinessServiceImpl();  
    5.       
    6.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
    7.             throws ServletException, IOException {  
    8.         response.setContentType("text/html;charset=UTF-8");  
    9.         PrintWriter out = response.getWriter();  
    10.         String p1_MerId = request.getParameter("p1_MerId");  
    11.         String r0_Cmd = request.getParameter("r0_Cmd");  
    12.         String r1_Code = request.getParameter("r1_Code");//支付结果。1代表成功  
    13.         String r2_TrxId = request.getParameter("r2_TrxId");  
    14.         String r3_Amt = request.getParameter("r3_Amt");  
    15.         String r4_Cur= request.getParameter("r4_Cur");  
    16.         String r5_Pid= request.getParameter("r5_Pid");  
    17.         String r6_Order = request.getParameter("r6_Order");//订单编号  
    18.         String r7_Uid = request.getParameter("r7_Uid");  
    19.         String r8_MP = request.getParameter("r8_MP");  
    20.         String r9_BType = request.getParameter("r9_BType");//1浏览器访问的。2点对点  
    21.         String hmac = request.getParameter("hmac");  
    22.           
    23.         //数据校验  
    24.         boolean ok = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd, r1_Code, r2_TrxId, r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid, r8_MP, r9_BType, "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl");  
    25.         if(!ok){  
    26.             out.write("数据有可能被篡改,请联系网站");  
    27.         }else{  
    28.             if("1".equals(r1_Code)){  
    29.                 //支付成功:根据订单号更改订单状态。  点卡或充值时注意表单的重复提交问题。  
    30.                 if("2".equals(r9_BType)){  
    31.                     out.write("success");  
    32.                 }  
    33.                   
    34.                 //更改订单的状态  
    35.                 /*Order order=s.findOrderByNum(r6_Order); 
    36.                 order.setStatus(1);  //1表示已付款,0表示未付款 
    37.                 s.updateOrder(order);*/  
    38.                 s.changeOrderStatus(1, r6_Order);  
    39.                 request.getSession().removeAttribute("cart");  
    40.                 response.setHeader("Refresh""2;URL="+request.getContextPath());  
    41.             }  
    42.         }  
    43.     }  
    44.   
    45.   
    46.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
    47.             throws ServletException, IOException {  
    48.           
    49.         doGet(request,response);  
    50.           
    51.       
    52.     }  
    53.   
    54. }  


    在这个网上书店的支付中,我们可以看到这样的效果:这里以支付1分钱为例,来演示在线支付功能。

    用户在浏览商品后加入购物车并生成订单了。



    先是跳转我们自己写的这个选择银行的表单中。


    支付的过程我们会先跳转到易宝支付的页面。



    我这里选择建设银行来支付。所以点击确定后就会跳转到建设银行的界面。





    支付成功之后就返回。




    然后就会跳转回我们自己的项目中,这个时候来查看一个订单的状态,会发现已经支付成功了。



    总结:在线支付功能是个非常实用的功能,我们都应该需要掌握其基本的开发流程,并亲自动手进行测试才会更加清楚了了解。这里的话呢,额界面比较丑,唉,将就着看吧!


    源码下载地址:http://download.csdn.net/download/qq_38869854/10231438


    展开全文
  • 支付宝APP支付功能开发

    千次阅读 2019-09-02 11:41:18
    2.签约功能 3.配置秘钥 支付宝开放平台配置秘钥 4.服务端集成SDK接入支付 客户端SDK 客户端 SDK 需要集成在商户自己的 APP 中,用于唤起支付宝 APP 并发送交易数据,并在支付宝APP返回商户APP时获得支付结果 ...

    前期准备工作

    1.创建应用并获取APPID(应用唯一标识)

    创建应用1
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 支付功能测试用例

    万次阅读 多人点赞 2018-11-21 14:58:44
    支付流程: 1:正常的发起一笔流量充值请求,检查点: 1)用户发过去的信息有携带key值 2)商户系统本地数据会留存一份用户的订单信息,并且会根据每笔订单信息生成一笔支付信息(同时留存到本地) 3)第三方支付...
  • 小程序微信支付功能开发

    万次阅读 多人点赞 2019-03-19 08:44:38
    关于小程序内唤起微信支付功能,不同人有不同的思路,有嵌套H5页面的,也有跳转第三方链接网站的,也有放收钱码等图片的。 今天讲一下微信原生的微信支付功能基础版块,支付页面和支付逻辑。 先上个效果图: 页面...
  • 微信小程序实现微信支付功能流程

    千次阅读 2018-12-11 13:26:42
    微信小程序实现微信支付功能流程微信支付:https://pay.weixin.qq.com/wiki/doc/api/index.html图片说明进行选择接入图片说明图片说明步骤:小程...
  • Android接入支付宝实现支付功能

    万次阅读 多人点赞 2017-06-28 13:46:17
    Android接入支付宝实现支付功能我本来是想直接讲Android支付这一块的,包括支付宝,微信,其他第三方整合支付等,但是微信开放平台他对我的账号做了限制,所有我今天就先把重心放在支付宝的支付上,也算是写得尽可能...
  • 随着微信小程序越来越受欢迎,微信小程序的开发越来越火,尤其是初创型公司需要开发自己的小程序,就需要知道微信小程序开发的一套流程,而且商家在运营小程序的时候开通支付功能是必然选项,本章博文就来讲一下微信...
  • 关于实现uniapp项目支付宝支付功能

    千次阅读 2021-01-16 21:05:24
    首先在对项目开启支付功能,在项目的manifest.json文件中勾选APP模块配置中的Payment支付模块,并将需要的信息填写完整,如下图 然后直接上代码: 定义一个按钮并绑定点击事件 <view class="btn"> <...
  • 订单支付功能对接支付宝支付接口

    千次阅读 2017-10-30 16:34:12
    订单支付功能是购物的最后一个环节,本文将通过对接支付宝的接口,实现支付宝付款功能。蚂蚁金服开放平台专门为开发者的网站,包含了支付宝中涉及的很多功能接口,本文的功能实现是在沙箱环境中进行,蚂蚁沙箱环境...
  • 微信H5支付功能开发

    千次阅读 2019-06-28 10:44:03
    本文介绍的是微信H5支付功能开发,也就是在微信之外的H5页面支付。 首先我们需要先看微信的官方文档https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1,这里面几乎介绍了全部流程了。等你了解大概流程...
  • SpringBoot集成支付宝支付功能(沙箱环境)

    千次阅读 热门讨论 2019-09-12 14:00:34
    一.在支付宝开放平台申请开通...后跳转到支付界面,则表示成功,由于是在沙箱环境下,不能进行支付,但支付宝支付功能已经开发完成,后续可申请企业认证,在正式环境下根据具体业务场景进行支付成功后的业务处理。
  • 前面给大家讲过一个借助小程序云开发实现微信支付的,但是那个操作稍微有点繁琐,并且还会经常出现问题,今天就给大家讲一个简单的,并且借助官方支付api实现小程序支付功能。 传送门 借助小程序云开发实现小程序...
  • JAVA实现微信支付功能

    万次阅读 多人点赞 2018-12-27 15:11:59
    这两天,需要接入微信支付功能。由于我是公众号开发,因此,我选择的微信支付方式是JSAPI支付方式。 二,解决方案 2.1 配置微信平台 ①配置微信公众平台 登录微信公众平台=》公众号设置=》功能设置=》网页授权域名 ...
  • 一、梳理支付的业务流程如下 :  点击支付---> 选择支付方式 ---> 确认金额---> 输入密码 ---> 成功支付  完成这个流程测试,也就是完成了项目的冒烟测试!然后需要测试针对流程中的每个阶段和步骤...
  • 支付功能如何进行测试

    千次阅读 2020-12-28 10:45:03
    非现金支付时代,非现金支付已经成为了生活不可或缺的一部分,我们只需要一台手机便可走遍全国各地(前提是支付宝,微信有钱<00>),那么作为测试人员,支付测试也是非常重要的一环,那么下面我就结合一下我的...
  • uniapp实现微信小程序支付功能

    千次阅读 2020-09-01 16:13:04
    首先要做支付功能,需要两个条件 1.必须是企业,个人用户不行 2.去微信支付平台提交资料审核 首先封装网络请求 api.js // 引进提示 import {errdata} from 'api/errdata.js' // GET let listing = function(urling...
  • 在线支付功能的设计及其实现

    千次阅读 2018-09-12 21:04:25
    们都知道,在现在的网站中,基本上都会有支付功能,在线支付作为一个潮流已是现代化网站的必备功能模块,那么几天我就分享一下如果来做这个在线支付功能。 在线支付一般来说有两种实现方式,一种是调用各个银行提供...
  • SSM 实现支付宝支付功能(图文详解+完整代码)

    千次阅读 多人点赞 2019-05-15 00:00:00
    程序员的成长之路互联网/程序员/成长/职场关注阅读本文大概需要 4 分钟。前言本教程详细介绍了如何使用ssm框架实现支付宝支付功能。本文章分为两大部分,分别是「支付宝测...
  • 支付功能基本测试点

    千次阅读 2020-12-30 08:38:50
    支付功能怎么测试? 功能方面: 正常完成支付的流程; 支付中断后继续支付的流程; 支付中断后结束支付的流程; 单订单支付的流程; 多订单合并支付的流程; 未绑定银行卡; 密码错误; 密码错误次数过多; 找人代付...
  • android studio 支付宝支付功能

    千次阅读 2018-10-10 16:19:42
    android studio 支付宝支付功能 第一步 :官网下载Demo(alipay_sdk包下的alipaySdk-20180601 配置给自己项目的libs包下) https://docs.open.alipay.com/54/104509/ 第二步 :AndroidManifest.xml 下配置 ...
  • 功能: 1、支付金额的最小值是0.01元 2、支付的时候是否可以选择多种支付方式 3、支付方式是否支持第三方支付,例如微信、支付宝 4、支付方式是否支持银行卡支付 5、是否支持朋友代付 6、是否支持人脸识别、指纹支付...
  • 如何进行支付功能的测试

    万次阅读 多人点赞 2019-10-11 23:17:09
    非现金支付时代,非现金支付已经成为了生活不可或缺的一部分,我们只需要一台手机便可走遍全国各地(前提是支付宝,微信有钱<00>),那么作为测试人员,支付测试也是非常重要的一环,那么下面我就结合一下我的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,646
精华内容 91,058
关键字:

支付功能