一、JAVA 充值DEMO
package hk.sohan.card.web.timer;
import hk.sohan.card.core.util.AppUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
public class SRRechargeDemo {
public static void recharge(String orderId, int chargeType, String operatorType, String mobile, String unitPrice) throws Exception {
JSONObject json = new JSONObject();
json.put("action", "CZ");// 交易指令码[充值]
json.put("orderId", orderId);// 订单号
json.put("chargeAcct", mobile);// 充值号码[手机、固话号码、QQ号码等
// 固话和宽带需要带区号,但不要分隔符。如:075588889999]
json.put("chargeCash", unitPrice);// 充值金额[单位:元]
json.put("chargeType", chargeType);// 充值类型[0:手机充值,1:流量充值,2:固话充值,3:宽带充值]
if (2 == chargeType || 3== chargeType) {
// 移动|联通|电信[充值固话和宽带时必填]
json.put("ispName", "电信");
}
json.put("retUrl", "http:\\/\\/www.baidu.com\\/rest");
String jsonStr = json.toString().replaceAll("\\\\\\\\", "\\\\");
String sign = AppUtils.md5Hex(jsonStr + "0FE8E43F53BB5848");
System.out.println("签名原文:" + jsonStr + "0FE8E43F53BB5848");
JSONObject params = new JSONObject();
params.put("sign", sign);
params.put("agentAccount", "api_test");
params.put("busiBody", json);
String paramsStr = params.toString().replaceAll("\\\\\\\\", "\\\\");
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost method = new HttpPost("http://api.sohan.hk:50080/API");
StringEntity entity = new StringEntity(paramsStr, "GBK");
System.out.println("提交:" + EntityUtils.toString(entity, "GBK"));
entity.setContentType("application/json");
method.setEntity(entity);
HttpResponse result = httpClient.execute(method);
String resData = EntityUtils.toString(result.getEntity(), "GBK");
System.out.println(resData);
}
public static void main(String[] args) throws Exception {
recharge("075586396893031", 3, "1", "075586396893", "1");
}
}
二、C# 充值DEMO
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using Newtonsoft.Json;
namespace Sohan.API.Demo
{
class Program
{
private static string apiUrl = "http://127.0.0.1:50080/API"; //api 服务器 地址
private static string userAcct = "SH-20120209064"; //api访问账户
private static string apiKey = "7A6E0E326AF4444A"; //api访问密钥
private static string returnUrl = "http://127.0.0.1:9900/"; //回调推送地址
static void Main(string[] args)
{
var orderId = DateTime.Now.ToString("yyyyMMddHHmmss"); //为了方便demo调用, orderId使用了当前时间, 请修改为自己的商户订单号Id
//Recharge(orderId, "13632622349",10, 0); //话费充值 调用
//Recharge(orderId, "13632622349", 3, 1, "", 0, 10); //流量充值 调用
Recharge(orderId, "075582672995", 100, 2,"电信"); //固话充值调用
//Recharge(orderId, "0539-053900691159", 100, 3, "联通"); //宽带充值调用
Console.ReadKey();
}
/// <summary>
/// 充值缴费
/// </summary>
/// <param name="orderId">商户订单号(保证唯一)</param>
/// <param name="chargeAcct">充值号码</param>
/// <param name="chargeCash">充值金额</param>
/// <param name="chargeType">充值类型.(目前demo只提供 0:手机充值 1:流量充值 2:固话充值 3:宽带充值)</param>
/// <param name="flowPackageType">充值流量类型 0:国包 1:省包 (手机话费充值时忽略)</param>
/// <param name="flowPackageSize">充值流量兆数 (手机话费充值时忽略)</param>
static void Recharge(string orderId,string chargeAcct,int chargeCash,int chargeType,string ispName="",int flowPackageType=0,int flowPackageSize=0)
{
if (chargeType == 1 && flowPackageSize==0) // cahrgeType 流量充值时, flowPackSize必须传.
{
Console.WriteLine("流量充值时, flowPackageSize 是必填值,不能为0");
return;
}
var busiModel = new //业务model
{
action = "CZ",
orderId,
chargeAcct,
chargeCash,
chargeType,
flowPackageType,
flowPackageSize,
qqProvince = "",
chargeAmount = 1,
productSn = "",
ispName,
retUrl = HttpUtility.UrlEncode(returnUrl)
};
var busiJson = JsonConvert.SerializeObject(busiModel); //得到业务报文的json串, 用于加密
var md5Source = busiJson + apiKey;
Console.WriteLine("签名原串:"+md5Source+ "\r\n");
var sign = MD5Encrypt(md5Source); //签名
Console.WriteLine("签名结果:"+sign+"\r\n");
var requsetModel = new //请求model
{
agentAccount = userAcct,
sign,
busiBody = busiModel
};
var requestJson = JsonConvert.SerializeObject(requsetModel);// 使用JsonConvert序列化成Json请引入 Newtonsoft.Json
Console.WriteLine("提交报文:"+requestJson+ "\r\n");
var response = HttpPost(requestJson, apiUrl, "text/plain"); //获取响应结果
Console.WriteLine("响应结果:"+response+ "\r\n");
}
public static string HttpPost(string postData, string url, string contentType = "application/x-www-form-urlencoded")
{
var req = (HttpWebRequest)WebRequest.Create(url);
var encoding = Encoding.GetEncoding("gb2312");
byte[] bs = Encoding.GetEncoding("gb2312").GetBytes(postData);
req.Method = WebRequestMethods.Http.Post;
req.ContentType = contentType;
req.ContentLength = bs.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bs, 0, bs.Length);
}
using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
{
string responseData;
using (StreamReader reader = new StreamReader(response.GetResponseStream(),encoding))
{
responseData = reader.ReadToEnd().ToString();
}
return responseData;
}
}
public static string MD5Encrypt(string pToEncrypt)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] InBytes = Encoding.UTF8.GetBytes(pToEncrypt);
byte[] OutBytes = md5.ComputeHash(InBytes);
string OutString = "";
for (int i = 0; i < OutBytes.Length; i++)
{
OutString += OutBytes[i].ToString("x2");
}
return OutString;
}
}
}