合同付款方式式:MNS2-3

博客分类:
第一RPC方式,不生成客户端代码
第二,document方式,不生成客户端代码
第三,用wsdl2java工具,生成客户端方式调用
package samples.quickstart.
import javax.xml.namespace.QN
import org.apache.axiom.om.OMAbstractF
import org.apache.axiom.om.OME
import org.apache.axiom.om.OMF
import org.apache.axiom.om.OMN
import org.apache.axis2.AxisF
import org.apache.axis2.addressing.EndpointR
import org.apache.axis2.client.O
import org.apache.axis2.client.ServiceC
import org.apache.axis2.rpc.client.RPCServiceC
import samples.quickstart.StockQuoteServiceS
import samples.quickstart.xsd.GetP
import samples.quickstart.xsd.GetPriceR
public class StockQuoteClient {
* 方法一:
* 应用rpc的方式调用 这种方式就等于远程调用,
* 即通过url定位告诉远程服务器,告知方法名称,参数等, 调用远程服务,得到结果。
* 使用 org.apache.axis2.rpc.client.RPCServiceClient类调用WebService
如果被调用的WebService方法有返回值 应使用 invokeBlocking 方法 该方法有三个参数
第一个参数的类型是QName对象,表示要调用的方法名;
第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];
当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。
第三个参数表示WebService方法的 返回值类型的Class对象,参数类型为Class[]。
如果被调用的WebService方法没有返回值 应使用 invokeRobust 方法
该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。
在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,
也就是 &wsdl:definitions&元素的targetNamespace属性值。
public static void testRPCClient() {
// axis1 服务端
// String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
// axis2 服务端
String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService?wsdl";
// 使用RPC方式调用WebService
RPCServiceClient serviceClient = new RPCServiceClient();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
Options options = serviceClient.getOptions();
//确定目标服务地址
options.setTo(targetEPR);
//确定调用方法
options.setAction("urn:getPrice");
* 指定要调用的getPrice方法及WSDL文件的命名空间
* 如果 webservice 服务端由axis2编写
* 命名空间 不一致导致的问题
* org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0
QName qname = new QName("http://quickstart.samples/xsd", "getPrice");
// 指定getPrice方法的参数值
Object[] parameters = new Object[] { "13" };
// 指定getPrice方法返回值的数据类型的Class对象
Class[] returnTypes = new Class[] { double.class };
// 调用方法一 传递参数,调用服务,获取服务返回结果集
OMElement element = serviceClient.invokeBlocking(qname, parameters);
//值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。
//我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果
String result = element.getFirstElement().getText();
System.out.println(result);
// 调用方法二 getPrice方法并输出该方法的返回值
Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);
// String r = (String) response[0];
Double r = (Double) response[0];
System.out.println(r);
} catch (AxisFault e) {
e.printStackTrace();
* 方法二: 应用document方式调用
* 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合
public static void testDocument() {
// String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
String url = "http://localhost:8080/StockQuote/services/StockQuoteServiceSOAP11port?wsdl";
Options options = new Options();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference(url);
options.setTo(targetEPR);
// options.setAction("urn:getPrice");
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMFactory fac = OMAbstractFactory.getOMFactory();
String tns = "http://quickstart.samples/";
// 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的
OMNamespace omNs = fac.createOMNamespace(tns, "");
OMElement method = fac.createOMElement("getPrice", omNs);
OMElement symbol = fac.createOMElement("symbol", omNs);
// symbol.setText("1");
symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String "));
method.addChild(symbol);
method.build();
OMElement result = sender.sendReceive(method);
System.out.println(result);
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
* 为SOAP Header构造验证信息,
* 如果你的服务端是没有验证的,那么你不用在Header中增加验证信息
* @param serviceClient
* @param tns 命名空间
* @param user
* @param passwrod
public void addValidation(ServiceClient serviceClient, String tns , String user, String passwrod) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(tns, "nsl");
OMElement header = fac.createOMElement("AuthenticationToken", omNs);
OMElement ome_user = fac.createOMElement("Username", omNs);
OMElement ome_pass = fac.createOMElement("Password", omNs);
ome_user.setText(user);
ome_pass.setText(passwrod);
header.addChild(ome_user);
header.addChild(ome_pass);
serviceClient.addHeader(header);
* 方法三:利用axis2插件生成客户端方式调用
public static void testCodeClient() {
String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";
StockQuoteServiceStub stub = new StockQuoteServiceStub(url);
GetPrice request = new GetPrice();
request.setSymbol("ABCD");
GetPriceResponse response = stub.getPrice(request);
System.out.println(response.get_return());
} catch (org.apache.axis2.AxisFault e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
public static void main(String[] args) {
StockQuoteClient.testRPCClient();
// StockQuoteClient.testDocument();
// StockQuoteClient.testCodeClient();
wsdl2java 用于根据WSDL生成相应的服务端和客户端代码的生成工具。命令行格式为:WSDL2Java [options] -uri &url or path& : A url or path to a WSDL
wsdl2java -uri http://localhost:8080/cxfService_0617/services/Hellows?wsdl -s -o build\client
其中常用的options具体如下:-o &path& : 指定生成代码的输出路径-a : 生成异步模式的代码-s : 生成同步模式的代码-p &pkg& : 指定代码的package名称-l &languange& : 使用的语言(Java/C) 默认是java-t : 为代码生成测试用例-ss : 生成服务端代码 默认不生成-sd : 生成服务描述文件 services.xml,仅与-ss一同使用-d &databinding& : 指定databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri-g : 生成服务端和客户端的代码-pn &port_name& : 当WSDL中有多个port时,指定其中一个port-sn &serv_name& : 选择WSDL中的一个service-u : 展开data-binding的类-r &path& : 为代码生成指定一个repository-ssi : 为服务端实现代码生成接口类-S : 为生成的源码指定存储路径-R : 为生成的resources指定存储路径–noBuildXML : 输出中不生成build.xml文件–noWSDL : 在resources目录中不生成WSDL文件–noMessageReceiver : 不生成MessageReceiver类
浏览 66621
harveyzeng
浏览: 270479 次
来自: 成都
很好,值得学习
java过滤emoji字符处理,希望能帮到你http://ww ...
不能匹配这个:http://harveyzeng.iteye. ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'甲公司欲购置一台设备,设备供应商有二种付款方式:_百度知道
甲公司欲购置一台设备,设备供应商有二种付款方式:
1.从第3年开始,每年年末支付39500元,连续支付4年。2.一次性付清设备款1340000元。假设年利率为4%,仅考虑付款的多少,请选择最好的付款决策。
我有更好的答案
1.从第3年开始,每年年末支付39500元,连续支付4年。现值=39500*(P/A,4%,4)*(P/F,4%,3)=*0.888=由于一次性付清设备款1340000,远远高于分期付款的现值,所以选择方案一付款方式。注:估计现实中相差不会这么离谱,可能是每年年末支付395000元,或者一次性付清设备款134000元,即使这样也选择分期付款方案。
采纳率:70%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
付款方式的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。MNS2是什么付款方式?_百度知道
MNS2是什么付款方式?
如题,谢谢。
我有更好的答案
该付款方式指的是的是在开票30天后,在每月2号付全款。希望可以帮到你。
采纳率:37%
为您推荐:
其他类似问题
您可能关注的内容
付款方式的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。TP3.2.3 接入银联支付
    项目接入银联支付的过程, 在此记录下,希望能帮助开发盆友平坑。
    银联SKD链接:https://open.unionpay.com/ajweb/product/newProDetail?proId=1&cataId=14
    首先我们先下载官方提供的SDK& ,下载好了解压选择版本 ,里面有PHP& java& .net& 这里我们自然是选择PHP版本的,接入前我们先配环境,它要我们PHP
  的版本&在5.3以上,并且需开启环境的curl、openssl功能。
   然后就是它提供的测试证书了,默认在window系统是放在D:/certs ,意思是在你的电脑的D创建一个名为certs 的文件夹,然后将4个证书放进去,测试的名为
 &acp_test_enc.cer  acp_test_middle.cer  acp_test_root.cer  acp_test_sign.pfx ,在创建一个名为logs文件夹D:/logs/& 放支付生成的日志文件,linux中请
 修改成Linux中的路径。
    你可以在assets文件夹中找到你要的证书,测试环境官方提供四个证书,生产环境官方提供三个,还个签名证书就是后缀为.pfx 的需要你去你的银联那里申请
  下载对应的你还需要可以需要解签名证书的密码 和商户号 , 这些后面都会提到的。
    在然后我们将名为SDK文件夹中的六个文件放到我们项目放到 ThinkPHP\Library\Vendor\Yunpay 的文件夹中
     写逻辑代码前你还得前配置好你的acp_sdk.ini 文件 ,文件里面都写的很清楚,这里就不一一解释了,这里是我的支付代码
//银联充值操作
public function pay()
header ( 'Content-type:text/charset=utf-8' );
Vendor('Yunpay.acp_service');
//前台通知地址
$frontUrl = "http://".I("server.HTTP_HOST")."/Assets/rechargedetail";
//后台通知地址
$backUrl = "http://".I("server.HTTP_HOST");
$params = array(
//以下信息非特殊情况不需要改动
'version' =& \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()-&version,
'encoding' =& 'utf-8',
//编码方式
'txnType' =& '01',
//交易类型
'txnSubType' =& '01',
//交易子类
'bizType' =& '000201',
//业务类型
'frontUrl' =&
$frontUrl,
//前台通知地址
'backUrl' =&
//后台通知地址
'signMethod' =& \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()-&signMethod,
//签名方法
'channelType' =& '08',
//渠道类型,07-PC,08-手机
'accessType' =& '0',
//接入类型
'currencyCode' =& '156',
// 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。
'payTimeout' =& date('YmdHis', strtotime('+15 minutes'))
//订单发送时间
$txnAmt = I('post.txnAmt');
//交易金额
$orderId = I('post.orderId');
//商户订单号
//加入商户参数
$params['txnAmt'] = $txnAmt*100;
$params['merId'] = C('Yunpay.merId');
$params['orderId'] = $orderId;
$params['txnTime'] = date('YmdHis');
//商品描述,可空
$body = trim(I('post.WIDbody'));
$ud = session('users.uid');
$data = array(
'uid'=&$ud,
'win_code'=&$orderId,
//商户订单号
'winsubject'=&I('post.WIDsubject'),
//订单名称
'wintotal_amount'=&$txnAmt,
//付款金额
'winbody'=&I('post.WIDbody'),
//商品描述
'state'=&'yl',
//支付方式
'status'=&'0',
//是否支付
'ordertime'=&time()
//交易时间
M("pay_record")-&add($data); // 保存交易信息
\com\unionpay\acp\sdk\AcpService::sign ( $params );
$uri = \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()-&frontTransU
$html_form = \com\unionpay\acp\sdk\AcpService::createAutoFormHtml( $params, $uri );
echo $html_form;
    这里我曾试过删除里面的命名空间用 new的方式去写,这样可以简洁代码,但是后面异步的时候报错,客服说不能删除命名空间,这样会导致方法名重复,所以还是乖乖的用demo
  中提供的方法。
    异步方法--------
//银联充值异步
public function xxx()
Vendor('Yunpay.acp_service');
$logger = \com\unionpay\acp\sdk\LogUtil::getLogger();
$logger-&LogInfo("receive back notify: " . \com\unionpay\acp\sdk\createLinkString ( $_POST, false, true ));
if (isset ( $_POST ['signature'] )) {
// echo \com\unionpay\acp\sdk\AcpService::validate ( $_POST ) ? '验签成功' : '验签失败';
$respCode = I('post.respCode');
$orderId = I('post.orderId');
// 商户订单号
$total_amount = I('post.settleAmt'); //订单金额
$trade_no = I('post.queryId');
// queryId 银联唯一标识一笔交易
//判断respCode=00、A6后,对涉及资金类的交易,请再发起查询接口查询,确定交易成功后更新数据库。
if( $respCode=='00' ){
$this-&unionpay($orderId,$total_amount,$trade_no);
$res = $this-&confirmpay($orderId,'1');
if( $res == 'Successful' ){
$this-&unionpay($orderId,$total_amount,$trade_no);
echo '交易失败';
echo '签名为空';
//银联充值
public function unionpay($orderId,$total_amount,$trade_no)
$per = M("pay_record")-&where('win_code='.$orderId)-&find(); //查找该订单
if( $per['status']=='1' ){
echo '已充值';
$Pay = M("pay");
// 在Pay模型中启动事务
$Pay-&startTrans();
// 进行相关的业务逻辑操作
$res = $Pay-&where('uid='.$per['uid'])-&setInc('money',$total_amount/100);
//数据组合
$data = array(
'alipay_number'=&$trade_no,
//银联唯一标识
'status'=&'1',
//交易状态
'paytime'=&time()
//交易时间
M("pay_record")-&where('win_code='.$orderId)-&save($data); // 修改交易信息
if (!empty($res)){
// 提交事务
$Pay-&commit();
// 事务回滚
$Pay-&rollback();
//确定是否充值操作
public function confirmpay($orderId,$L)
header ( 'Content-type:text/charset=utf-8' );
Vendor('Yunpay.acp_service');
$params = array(
//以下信息非特殊情况不需要改动
'version' =& \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()-&version,
'encoding' =& 'utf-8',
//编码方式
'signMethod' =& \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()-&signMethod,
//签名方法
'txnType' =& '00',
//交易类型
'txnSubType' =& '00',
//交易子类
'bizType' =& '000000',
//业务类型
'accessType' =& '0',
//接入类型
'channelType' =& '07',
//渠道类型
if($L == '0'){
$time = M("order_pay")-&where('win_code = "'.$orderId.'"')-&find()['addtime'];
$time = M("pay_record")-&where('win_code = "'.$orderId.'"')-&find()['ordertime'];
$params['merId'] = C('Yunpay.merId');
$params['orderId'] = $orderId;
//交易的订单号
$params['txnTime'] = date('YmdHis',$time); //订单发送时间
\com\unionpay\acp\sdk\AcpService::sign ( $params ); // 签名
$url = \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()-&singleQueryU
$result_arr = \com\unionpay\acp\sdk\AcpService::post ( $params, $url);
if(count($result_arr)&=0) { //没收到200应答的情况
return 'No200';
if (!\com\unionpay\acp\sdk\AcpService::validate ($result_arr) ){
return "应答报文验签失败";
<span style="color: #0
if ($result_arr["respCode"] == "00"){
<span style="color: #1
if ($result_arr["origRespCode"] == "00"){
<span style="color: #2
//交易成功
<span style="color: #3
<span style="color: #4
return "Successful";
<span style="color: #5
} else if ($result_arr["origRespCode"] == "03"
<span style="color: #6
|| $result_arr["origRespCode"] == "04"
<span style="color: #7
|| $result_arr["origRespCode"] == "05"){
<span style="color: #8
//后续需发起交易状态查询交易确定交易状态
<span style="color: #9
<span style="color: #0
return "交易处理中,请稍微查询";
<span style="color: #1
<span style="color: #2
//其他应答码做以失败处理
<span style="color: #3
<span style="color: #4
return "交易失败:" . $result_arr["origRespMsg"];
<span style="color: #5
<span style="color: #6
} else if ($result_arr["respCode"] == "03"
<span style="color: #7
|| $result_arr["respCode"] == "04"
<span style="color: #8
|| $result_arr["respCode"] == "05" ){
<span style="color: #9
//后续需发起交易状态查询交易确定交易状态
<span style="color: #0
<span style="color: #1
return "处理超时,请稍微查询";
<span style="color: #2
<span style="color: #3
//其他应答码做以失败处理
<span style="color: #4
<span style="color: #5
return "失败:" . $result_arr["respMsg"];
<span style="color: #6
<span style="color: #7
<span style="color: #8
    这里第一个方法xxx 中的respCode等于00 就是支付成功 ,如果没有需要根据你生成的订单号在次查询在结果。这里客服说这种失败不好模拟,就不说了,但是这操作方法还是
  建议写下,以防万一 。
    最后说明下几个参数 queryId& 银联唯一标识,需要保存, 还有银联支付是按 '分' 做单位的 所以支付跳转前& 假如是1元,你得乘以100,它才可以识别为1元,要不然就是0.01元
  然后异步到你的时候,如果你是元的单位在除于100,如果是分就不用了。
    搞定收工 , 祝大家早日成为大牛
阅读(...) 评论()高中数学选修2-3模块测试题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
高中数学选修2-3模块测试题
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
&#xe64e;加入VIP
还剩4页未读,
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 d p付款方式 的文章

 

随机推荐