CXT如何layer 调用父窗口方法Radio Parameters窗口

LTE常见笔试面试知识点整理更新_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
LTE常见笔试面试知识点整理更新
上传于||文档简介
&&L​T​E​常​见​笔​试​面​试​知​识​点​整​理​,​常​见​问​题​优​化​思​路​。
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩24页未读,继续阅读
你可能喜欢/ lottery-android
项目语言:JAVA
权限:read-only(如需更高权限请先加入项目)
lottery-android/
Index: PayResultActivity.java
===================================================================
--- PayResultActivity.java (revision 0)
+++ PayResultActivity.java (revision 111)
@@ -0,0 +1,106 @@
+package com.caidouzi.lotterynew.
+import java.io.S
+import android.app.A
+import android.content.I
+import android.os.B
+import android.text.H
+import android.view.V
+import android.widget.B
+import android.widget.TextV
+import com.caidouzi.lotterynew.R;
+import com.caidouzi.lotterynew.base.BaseA
+import com.caidouzi.T
+import com.caidouzi.lotterynew.utils.HtmlTagU
+public class PayResultActivity extends BaseActivity {
+ private TextView tvPayR
+ private TextView tvPayD
+ private Button button1;
+ private Button button2;
+ private PayResultBean payResultB
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay_result);
setCenterTitle(&充值结果&);
payResultBean = (PayResultBean)getIntent().getSerializableExtra(TYPE_PAY_BEAN);
findViews();
initViewsByPayResultType(payResultBean);
+ private void findViews() {
tvPayResult = (TextView)findViewById( R.id.tv_pay_result );
tvPayDesc = (TextView)findViewById( R.id.tv_pay_desc );
button1 = (Button)findViewById( R.id.button1 );
button2 = (Button)findViewById( R.id.button2 );
button1.setOnClickListener( this );
button2.setOnClickListener( this );
+ @Override
+ public void onClick(View v) {
if ( v == button1 ) {
if(payResultBean.payResultType == TYPE_PAY_RESULT_SUCCESS){
ComTools.closeActivityByName(&com.caidouzi.lotterynew.my&, &RechargeActivity&);
updateUserInfoAndFinish(this);
} else if ( v == button2 ) {
ComTools.closeActivityByName(&com.caidouzi.lotterynew.my&, &RechargeActivity&);
super.onClick(v);
+ public static final int TYPE_PAY_RESULT_SUCCESS = 1;
+ public static final int TYPE_PAY_RESULT_FAILURE = 0;
+ public static final String TYPE_PAY_BEAN = &PayResultBean&;
+ private void initViewsByPayResultType(PayResultBean bean){
int type = bean.payResultT
if(type == TYPE_PAY_RESULT_SUCCESS){
button1.setVisibility(View.VISIBLE);
button2.setVisibility(View.VISIBLE);
button1.setText(&去购彩&);
button2.setText(&继续充值&);
tvPayResult.setText(&充值成功&);
tvPayResult.setCompoundDrawablesWithIntrinsicBounds(R.drawable.success, 0, 0, 0);
tvPayDesc.setText(Html.fromHtml(&充值金额:& + HtmlTagUtils.appendFontTag(bean.payPrice, &#ff0029&) + &元&));
}else if(type == TYPE_PAY_RESULT_FAILURE){
button1.setVisibility(View.VISIBLE);
button2.setVisibility(View.GONE);
button1.setText(&重新充值&);
tvPayResult.setText(&充值失败&);
tvPayResult.setCompoundDrawablesWithIntrinsicBounds(R.drawable.failed, 0, 0, 0);
tvPayDesc.setText(Html.fromHtml(&原因:& + HtmlTagUtils.appendFontTag(bean.payFailureDesc, &#ff0029&)));
+ public static class PayResultBean implements Serializable{
private static final long serialVersionUID = -0949254L;
int payResultT
String payP
String payFailureD
public PayResultBean(int payResultType, String payPrice, String payFailureDesc) {
this.payResultType = payResultT
this.payPrice = payP
this.payFailureDesc = payFailureD
+ public static void showPayResult(Activity act,int type,String price,String failureMsg){
Intent intent = new Intent(act,PayResultActivity.class);
intent.putExtra(PayResultActivity.TYPE_PAY_BEAN, new PayResultActivity.PayResultBean(type, price, failureMsg));
act.startActivity(intent);
Index: PayCallBack.java
===================================================================
--- PayCallBack.java (revision 0)
+++ PayCallBack.java (revision 111)
@@ -0,0 +1,15 @@
+package com.caidouzi.lotterynew.
+public interface PayCallBack {
* @param msg 支付返回的结果
+ void onSuccess(String msg);
* @param msg
+ void onFailure(String msg);
Index: lianlian/activity/StandActivity.java
===================================================================
--- lianlian/activity/StandActivity.java (revision 0)
+++ lianlian/activity/StandActivity.java (revision 111)
@@ -0,0 +1,126 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import android.content.C
+import android.content.I
+import android.os.B
+import android.text.H
+import android.text.TextU
+import android.view.V
+import android.widget.B
+import android.widget.EditT
+import android.widget.LinearL
+import android.widget.TextV
+import android.widget.T
+import com.caidouzi.lotterynew.R;
+import com.caidouzi.lotterynew.base.NumberKeyboardViewA
+import com.caidouzi.lotterynew.my.bean.UserI
+import com.caidouzi.lotterynew.pay.PayCallB
+import com.caidouzi.lotterynew.pay.PayResultA
+import com.caidouzi.lotterynew.pay.lianlian.env.LianLianPayP
+import com.caidouzi.lotterynew.utils.DefaultSP;
+public class StandActivity extends NumberKeyboardViewActivity {
+ private Button jump_
+ private String userId = &&;//用户唯一标示id
+ private String idCard = &&;//用户身份证
+ private String name = &&;//用户姓名
+ private String money = &&;//充值金额 b
+ private String agree_no = &&;//银行卡历次支付时填写,可以查询得到,协议号匹配会进入SDK
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setCenterTitle(&快捷支付&);
setTitleLeftButtonVisibility(true);
userInfo = getApp().getUserInfo();
userId = userInfo.UserId;
idCard = userInfo.UserIdC
name = userInfo.RealN
money = getIntent().getStringExtra(&money&);
agree_no = getIntent().getStringExtra(&agree_no&);
//agree_no = DefaultSP.getInstance().readString(&agreementno&);
setContentView(R.layout.standpay);
jump_btn = (Button) findViewById(R.id.jump_btn);
jump_btn.setOnClickListener(this);
setupBindCard();
setupKeyBoard();
+ @Override
+ public void onClick(View v) {
switch (v.getId()) {
case R.id.jump_btn:
// TODO 卡前置方式, 如果传入的是卡号,卡号必须大于等于14位
if (TextUtils.isEmpty(((EditText) findViewById(R.id.bankno)).getText().toString())) {
Toast.makeText(StandActivity.this, &必须填入银行卡卡号&, Toast.LENGTH_LONG).show();
plugin = new LianLianPayPlugin(userId, idCard, name, money, getBankNo(), agree_no,userInfo.Zctime, StandActivity.this);
plugin.setPayCallBack(new PayCallBack() {
public void onSuccess(String msg) {
DefaultSP.getInstance().writeInt(DefaultSP.KEY_LAST_PAY_TYPE, DefaultSP.TYPE_LAST_PAY_KUAIJIE);
PayResultActivity.showPayResult(StandActivity.this, PayResultActivity.TYPE_PAY_RESULT_SUCCESS, money, &&);
public void onFailure(String msg) {
PayResultActivity.showPayResult(StandActivity.this, PayResultActivity.TYPE_PAY_RESULT_FAILURE, money, msg);
plugin.pay();
super.onClick(v);
+ public static Intent createIntent(Context context,String money,String agree_no){
Intent intent = new Intent(context, StandActivity.class);
intent.putExtra(&money&, money);
intent.putExtra(&agree_no&, agree_no);
+ private void setupBindCard(){
//showProgressDialog(&正在获取绑定银行卡...&);
TextView tv_name_desc = (TextView) findViewById(R.id.tv_name_desc);
String lastName = name.substring(name.length()-1);
String firstName = name.substring(0,1);
for (int i = 0; i & name.length() - 1; i++) {
lastName = &*& + lastN
tv_name_desc.setText(Html.fromHtml(&只有使用开户名为&font color='red'&&+lastName+&&/font&的银行卡才能充值成功&));
} catch (Exception e) {
tv_name_desc.setText(Html.fromHtml(&只有使用开户名为&font color='red'&&+name+&&/font&的银行卡才能充值成功&));
e.printStackTrace();
+ private String getBankNo(){
EditText bankno = (EditText) findViewById(R.id.bankno);
String cardNumber = bankno.getText().toString().replaceAll(& &, &&);
return cardN
+ private LinearLayout ll_
+ private LianLianPayP
+ private UserInfo userI
+ private void setupKeyBoard(){
EditText bankno = (EditText) findViewById(R.id.bankno);
setFocusView(bankno);
ll_keyboard = (LinearLayout) findViewById(R.id.ll_keyboard);
ll_keyboard.addView(getKeyBoardController().getView());
Index: lianlian/activity/BindCardAdapter.java
===================================================================
--- lianlian/activity/BindCardAdapter.java (revision 0)
+++ lianlian/activity/BindCardAdapter.java (revision 111)
@@ -0,0 +1,78 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import java.util.L
+import android.content.C
+import android.view.V
+import android.view.ViewG
+import android.widget.BaseA
+import android.widget.LinearL
+import android.widget.TextV
+import com.caidouzi.lotterynew.R;
+import com.caidouzi.lotterynew.my.bean.BinkItemB
+public class BindCardAdapter extends BaseAdapter {
+ private List&BinkItemBean&
+ private Context mC
+ public BindCardAdapter(List&BinkItemBean& list, Context mContext) {
this.list =
this.mContext = mC
+ @Override
+ public int getCount() {
return list.size();
+ @Override
+ public Object getItem(int position) {
return list.get(position);
+ @Override
+ public long getItemId(int position) {
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder =
if(convertView == null){
holder = new ViewHolder();
convertView = View.inflate(mContext, R.layout.item_bind_bank_card, null);
holder.ll_item_band_card_root = (LinearLayout) convertView.findViewById(R.id.ll_item_band_card_root);
holder.tv_card_number = (TextView) convertView.findViewById(R.id.tv_card_number);
holder.tv_card_bank_name = (TextView) convertView.findViewById(R.id.tv_card_bank_name);
holder.tv_card_type = (TextView) convertView.findViewById(R.id.tv_card_type);
convertView.setTag(holder);
holder = (ViewHolder) convertView.getTag();
BinkItemBean bean = list.get(position);
int cardType = bean.getCard_type();
if(cardType == 2){
holder.tv_card_type.setText(&(借)&);
holder.ll_item_band_card_root.setBackgroundResource(R.drawable.pink_rect);
}else if(cardType == 3){
holder.tv_card_type.setText(&(信)&);
holder.ll_item_band_card_root.setBackgroundResource(R.drawable.circle_blue_rect);
holder.tv_card_number.setText(bean.getBankNo().substring(bean.getBankNo().length() - 4));
holder.tv_card_bank_name.setText(bean.getBankName());
return convertV
+ static class ViewHolder{
TextView tv_card_
TextView tv_card_bank_
TextView tv_card_
LinearLayout ll_item_band_card_
Index: lianlian/utils/ResultChecker.java
===================================================================
--- lianlian/utils/ResultChecker.java (revision 0)
+++ lianlian/utils/ResultChecker.java (revision 111)
@@ -0,0 +1,101 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import java.util.ArrayL
+import java.util.I
+import java.util.L
+import org.apache.http.NameValueP
+import org.apache.http.message.BasicNameValueP
+import org.json.JSONO
+import android.util.L
+import com.caidouzi.lotterynew.pay.lianlian.env.EnvC
+ * 对签名进行验签
+public class ResultChecker{
public static final int RESULT_INVALID_PARAM
public static final int RESULT_CHECK_SIGN_FAILED
public static final int RESULT_CHECK_SIGN_TYPE_FAILED = -1;
public static final int RESULT_CHECK_SIGN_SUCCEED
public ResultChecker(String content)
this.mContent =
* 对签名进行验签
public int checkSign()
int retVal = RESULT_CHECK_SIGN_SUCCEED;
JSONObject objContent = BaseHelper.string2JSON(this.mContent);
// 获取待签名数据
String signContent = getSignContent(objContent);
Log.i(&ResultChecker&, &支付结果待签名数据:& + signContent);
// 获取签名类型
String signType = objContent.optString(&sign_type&);
// 获取签名
String sign = objContent.optString(&sign&);
// 进行验签 返回验签结果
if (signType.equalsIgnoreCase(&RSA&))
if (!Rsa.doCheck(signContent, sign, EnvConstants.RSA_YT_PUBLIC))
retVal = RESULT_CHECK_SIGN_FAILED;
Log.e(&ResultChecker&, &RESULT_CHECK_SIGN_FAILED&);
} else if(signType.equalsIgnoreCase(&MD5&))
if (!Md5Algorithm.getInstance().doCheck(signContent, sign,
EnvConstants.MD5_KEY))
retVal = RESULT_CHECK_SIGN_FAILED;
Log.e(&ResultChecker&, &RESULT_CHECK_SIGN_FAILED&);
Log.e(&ResultChecker&, &RESULT_CHECK_SIGN_TYPE_FAILED&);
retVal = RESULT_CHECK_SIGN_TYPE_FAILED;
} catch (Exception e)
retVal = RESULT_INVALID_PARAM;
e.printStackTrace();
return retV
private String getSignContent(JSONObject objResult)
List&NameValuePair& parameters = new ArrayList&NameValuePair&();
for (Iterator&?& it = objResult.keys(); it.hasNext();)
String key = (String) it.next();
// ret_code、ret_msg、sign不参与签名
if (&ret_code&.equalsIgnoreCase(key)
|| &ret_msg&.equalsIgnoreCase(key)
|| &sign&.equalsIgnoreCase(key)
|| &agreementno&.equalsIgnoreCase(key))
parameters
.add(new BasicNameValuePair(key, objResult.optString(key)));
String content = BaseHelper.sortParam(parameters);
\ No newline at end of file
Index: lianlian/utils/Base64.java
===================================================================
--- lianlian/utils/Base64.java (revision 0)
+++ lianlian/utils/Base64.java (revision 111)
@@ -0,0 +1,289 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+ * Base64 工具类
+public final class Base64 {
+ static private final int BASELENGTH = 128;
+ static private final int LOOKUPLENGTH = 64;
+ static private final int TWENTYFOURBITGROUP = 24;
+ static private final int EIGHTBIT = 8;
+ static private final int SIXTEENBIT = 16;
+ static private final int FOURBYTE = 4;
+ static private final int SIGN = -128;
+ static private final char PAD = '=';
+ static private final boolean fDebug =
+ static final private byte[] base64Alphabet = new byte[BASELENGTH];
+ static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
+ static {
for (int i = 0; i & BASELENGTH; ++i) {
base64Alphabet[i] = -1;
for (int i = 'Z'; i &= 'A'; i--) {
base64Alphabet[i] = (byte) (i - 'A');
for (int i = 'z'; i &= 'a'; i--) {
base64Alphabet[i] = (byte) (i - 'a' + 26);
for (int i = '9'; i &= '0'; i--) {
base64Alphabet[i] = (byte) (i - '0' + 52);
base64Alphabet['+'] = 62;
base64Alphabet['/'] = 63;
for (int i = 0; i &= 25; i++) {
lookUpBase64Alphabet[i] = (char) ('A' + i);
for (int i = 26, j = 0; i &= 51; i++, j++) {
lookUpBase64Alphabet[i] = (char) ('a' + j);
for (int i = 52, j = 0; i &= 61; i++, j++) {
lookUpBase64Alphabet[i] = (char) ('0' + j);
lookUpBase64Alphabet[62] = (char) '+';
lookUpBase64Alphabet[63] = (char) '/';
+ private static boolean isWhiteSpace(char octect) {
return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
+ private static boolean isPad(char octect) {
return (octect == PAD);
+ private static boolean isData(char octect) {
return (octect & BASELENGTH && base64Alphabet[octect] != -1);
* Encodes hex octects into Base64
* @param binaryData
Array containing binaryData
* @return Encoded Base64 array
+ public static String encode(byte[] binaryData) {
if (binaryData == null) {
int lengthDataBits = binaryData.length * EIGHTBIT;
if (lengthDataBits == 0) {
return &&;
int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1
char encodedData[] =
encodedData = new char[numberQuartet * 4];
byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
int encodedIndex = 0;
int dataIndex = 0;
if (fDebug) {
System.out.println(&number of triplets = & + numberTriplets);
for (int i = 0; i & numberT i++) {
b1 = binaryData[dataIndex++];
b2 = binaryData[dataIndex++];
b3 = binaryData[dataIndex++];
if (fDebug) {
System.out.println(&b1= & + b1 + &, b2= & + b2 + &, b3= & + b3);
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 && 2)
: (byte) ((b1) && 2 ^ 0xc0);
byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 && 4)
: (byte) ((b2) && 4 ^ 0xf0);
byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 && 6)
: (byte) ((b3) && 6 ^ 0xfc);
if (fDebug) {
System.out.println(&val2 = & + val2);
System.out.println(&k4
= & + (k && 4));
System.out.println(&vak
= & + (val2 | (k && 4)));
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k && 4)];
encodedData[encodedIndex++] = lookUpBase64Alphabet[(l && 2) | val3];
encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
// form integral number of 6-bit groups
if (fewerThan24bits == EIGHTBIT) {
b1 = binaryData[dataIndex];
k = (byte) (b1 & 0x03);
if (fDebug) {
System.out.println(&b1=& + b1);
System.out.println(&b1&&2 = & + (b1 && 2));
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 && 2)
: (byte) ((b1) && 2 ^ 0xc0);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[k && 4];
encodedData[encodedIndex++] = PAD;
encodedData[encodedIndex++] = PAD;
} else if (fewerThan24bits == SIXTEENBIT) {
b1 = binaryData[dataIndex];
b2 = binaryData[dataIndex + 1];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 && 2)
: (byte) ((b1) && 2 ^ 0xc0);
byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 && 4)
: (byte) ((b2) && 4 ^ 0xf0);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k && 4)];
encodedData[encodedIndex++] = lookUpBase64Alphabet[l && 2];
encodedData[encodedIndex++] = PAD;
return new String(encodedData);
* Decodes Base64 data into octects
* @param encoded
string containing Base64 data
* @return Array containind decoded data.
+ public static byte[] decode(String encoded) {
if (encoded == null) {
char[] base64Data = encoded.toCharArray();
// remove white spaces
int len = removeWhiteSpace(base64Data);
if (len % FOURBYTE != 0) {
// should be divisible by four
int numberQuadruple = (len / FOURBYTE);
if (numberQuadruple == 0) {
return new byte[0];
byte decodedData[] =
byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
int i = 0;
int encodedIndex = 0;
int dataIndex = 0;
decodedData = new byte[(numberQuadruple) * 3];
for (; i & numberQuadruple - 1; i++) {
if (!isData((d1 = base64Data[dataIndex++]))
|| !isData((d2 = base64Data[dataIndex++]))
|| !isData((d3 = base64Data[dataIndex++]))
|| !isData((d4 = base64Data[dataIndex++]))) {
}// if found &no data& just return null
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (byte) (b1 && 2 | b2 && 4);
decodedData[encodedIndex++] = (byte) (((b2 & 0xf) && 4) | ((b3 && 2) & 0xf));
decodedData[encodedIndex++] = (byte) (b3 && 6 | b4);
if (!isData((d1 = base64Data[dataIndex++]))
|| !isData((d2 = base64Data[dataIndex++]))) {
// if found &no data& just return null
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
d3 = base64Data[dataIndex++];
d4 = base64Data[dataIndex++];
if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters
if (isPad(d3) && isPad(d4)) {
if ((b2 & 0xf) != 0)// last 4 bits should be zero
byte[] tmp = new byte[i * 3 + 1];
System.arraycopy(decodedData, 0, tmp, 0, i * 3);
tmp[encodedIndex] = (byte) (b1 && 2 | b2 && 4);
} else if (!isPad(d3) && isPad(d4)) {
b3 = base64Alphabet[d3];
if ((b3 & 0x3) != 0)// last 2 bits should be zero
byte[] tmp = new byte[i * 3 + 2];
System.arraycopy(decodedData, 0, tmp, 0, i * 3);
tmp[encodedIndex++] = (byte) (b1 && 2 | b2 && 4);
tmp[encodedIndex] = (byte) (((b2 & 0xf) && 4) | ((b3 && 2) & 0xf));
} else { // No PAD e.g 3cQl
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (byte) (b1 && 2 | b2 && 4);
decodedData[encodedIndex++] = (byte) (((b2 & 0xf) && 4) | ((b3 && 2) & 0xf));
decodedData[encodedIndex++] = (byte) (b3 && 6 | b4);
return decodedD
* remove WhiteSpace from MIME containing encoded Base64 data.
* @param data
the byte array of base64 data (with WS)
* @return the new length
+ private static int removeWhiteSpace(char[] data) {
if (data == null) {
// count characters that's not whitespace
int newSize = 0;
int len = data.
for (int i = 0; i & i++) {
if (!isWhiteSpace(data[i])) {
data[newSize++] = data[i];
return newS
Index: lianlian/utils/NetworkManager.java
===================================================================
--- lianlian/utils/NetworkManager.java (revision 0)
+++ lianlian/utils/NetworkManager.java (revision 111)
@@ -0,0 +1,196 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import java.io.F
+import java.io.FileOutputS
+import java.io.IOE
+import java.io.InputS
+import java.io.OutputS
+import java.net.HttpURLC
+import java.net.InetSocketA
+import java.net.P
+import java.net.URL;
+import javax.net.ssl.HostnameV
+import javax.net.ssl.HttpsURLC
+import javax.net.ssl.SSLS
+import org.apache.http.entity.StringE
+import android.content.C
+import android.net.ConnectivityM
+import android.net.NetworkI
+ * 网络连接工具类
+ * @author linys
+public class NetworkManager{
static final String TAG
= &NetworkManager&;
private int
connectTimeout = 30 * 1000;
private int
readTimeout
= 30 * 1000;
public NetworkManager(Context context)
this.mContext =
setDefaultHostnameVerifier();
* 检查代理,是否cnwap接入
private void detectProxy()
ConnectivityManager cm = (ConnectivityManager) mContext
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.isAvailable()
&& ni.getType() == ConnectivityManager.TYPE_MOBILE)
String proxyHost = android.net.Proxy.getDefaultHost();
int port = android.net.Proxy.getDefaultPort();
if (proxyHost != null)
final InetSocketAddress sa = new InetSocketAddress(proxyHost,
mProxy = new Proxy(Proxy.Type.HTTP, sa);
private void setDefaultHostnameVerifier()
HostnameVerifier hv = new HostnameVerifier(){
public boolean verify(String hostname, SSLSession session)
HttpsURLConnection.setDefaultHostnameVerifier(hv);
* 发送和接收数据
* @param strReqData
* @param strUrl
public String SendAndWaitResponse(String strReqData, String strUrl)
detectProxy();
String strResponse =
// ArrayList&BasicNameValuePair& pairs = new ArrayList&BasicNameValuePair&();
// pairs.add(new BasicNameValuePair(&requestData&, strReqData));
HttpURLConnection httpConnect =
StringEntity p_
// p_entity = new UrlEncodedFormEntity(pairs, &utf-8&);
p_entity = new StringEntity(strReqData, &utf-8&);
URL url = new URL(strUrl);
if (mProxy != null)
httpConnect = (HttpURLConnection) url.openConnection(mProxy);
httpConnect = (HttpURLConnection) url.openConnection();
httpConnect.setConnectTimeout(connectTimeout);
httpConnect.setReadTimeout(readTimeout);
httpConnect.setDoOutput(true);
httpConnect.addRequestProperty(&Content-type&,
&application/x-www-form-charset=utf-8&);
httpConnect.connect();
OutputStream os = httpConnect.getOutputStream();
p_entity.writeTo(os);
os.flush();
InputStream content = httpConnect.getInputStream();
strResponse = BaseHelper.convertStreamToString(content);
BaseHelper.log(TAG, &response & + strResponse);
} catch (IOException e)
e.printStackTrace();
httpConnect.disconnect();
return strR
* 下载文件
* @param context
上下文环境
* @param strurl
* @param path
public boolean urlDownloadToFile(Context context, String strurl, String path)
boolean bRet =
detectProxy();
URL url = new URL(strurl);
HttpURLConnection conn =
if (mProxy != null)
conn = (HttpURLConnection) url.openConnection(mProxy);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(connectTimeout);
conn.setReadTimeout(readTimeout);
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
File file = new File(path);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = is.read(temp)) & 0)
fos.write(temp, 0, i);
fos.close();
is.close();
} catch (IOException e)
e.printStackTrace();
Index: lianlian/utils/PayOrder.java
===================================================================
--- lianlian/utils/PayOrder.java (revision 0)
+++ lianlian/utils/PayOrder.java (revision 111)
@@ -0,0 +1,251 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import java.io.S
+public class PayOrder implements Serializable {
public static final String SIGN_TYPE_RSA = &RSA&;
public static final String SIGN_TYPE_MD5 = &MD5&;
private static final long serialVersionUID = 1L;
private String oid_ // 商户编号是商户在连连钱包支付平台上开设的商户号码,为18位数字,如:001004
private String notify_ // 连连钱包支付平台在用户支付成功后通知商户服务端的地址
private String busi_ // 虚拟商品销售:101001,实物商品销售:109001
private String no_ // 商户系统唯一订单号
private String dt_ // 格式:YYYYMMDDH24MISS 14位数字,精确到秒
private String no_
private String name_
private String money_ // 该笔订单的资金总额,单位为RMB-元。大于0的数字,精确到小数点后两位。如:49.65
private String sign_ // 参与签名
private String info_ // 订单描述
private String bank_ // 银行编号
private String force_ // 是否强制使用该银行的银行卡标志(0为不强制,1为强制)
private String pay_ // 支付方式(2:借记卡,3:信用卡)
private String valid_ // 订单有效期
private String risk_ // 风控字段
// 以下字段不参与签名
private String id_
private String id_
private String acct_
private String no_
// 银行卡协议号 支付成功后返回的,如果是卡前置,需要传入。
private String card_
// 银行卡号 卡前置,卡首次支付的时候传入,卡历次支付传入对应协议号就可以
private String flag_
private String user_ // 用户id
public String getUser_id() {
return user_
public String getCard_no() {
return card_
public void setCard_no(String card_no) {
this.card_no = card_
public String getNo_agree() {
return no_
public void setNo_agree(String no_agree) {
this.no_agree = no_
public String getRisk_item() {
return risk_
public void setRisk_item(String risk_item) {
this.risk_item = risk_
public void setUser_id(String user_id) {
this.user_id = user_
public String getId_type() {
return id_
public void setId_type(String id_type) {
this.id_type = id_
public String getId_no() {
return id_
public void setId_no(String id_no) {
this.id_no = id_
public String getAcct_name() {
return acct_
public void setAcct_name(String acct_name) {
this.acct_name = acct_
public String getFlag_modify() {
return flag_
public void setFlag_modify(String flag_modify) {
this.flag_modify = flag_
public String getSign()
public void setSign(String sign)
this.sign =
public String getSign_type()
return sign_
public void setSign_type(String sign_type)
this.sign_type = sign_
public String getOid_partner()
return oid_
public void setOid_partner(String oid_partner)
this.oid_partner = oid_
public String getNotify_url()
return notify_
public void setNotify_url(String notify_url)
this.notify_url = notify_
public String getBusi_partner()
return busi_
public void setBusi_partner(String busi_partner)
this.busi_partner = busi_
public String getNo_order()
return no_
public void setNo_order(String no_order)
this.no_order = no_
public String getDt_order()
return dt_
public void setDt_order(String dt_order)
this.dt_order = dt_
public String getNo_goods()
return no_
public void setNo_goods(String no_goods)
this.no_goods = no_
public String getName_goods()
return name_
public void setName_goods(String name_goods)
this.name_goods = name_
public String getMoney_order()
return money_
public void setMoney_order(String money_order)
this.money_order = money_
public String getBank_code()
return bank_
public void setBank_code(String bank_code)
this.bank_code = bank_
public String getForce_bank()
return force_
public void setForce_bank(String force_bank)
this.force_bank = force_
public String getInfo_order()
return info_
public void setInfo_order(String info_order)
_order = info_
public String getPay_type()
return pay_
public void setPay_type(String pay_type)
this.pay_type = pay_
public String getValid_order()
return valid_
public void setValid_order(String valid_order)
this.valid_order = valid_
Index: lianlian/utils/Rsa.java
===================================================================
--- lianlian/utils/Rsa.java (revision 0)
+++ lianlian/utils/Rsa.java (revision 111)
@@ -0,0 +1,63 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import java.security.KeyF
+import java.security.PrivateK
+import java.security.PublicK
+import java.security.spec.PKCS8EncodedKeyS
+import java.security.spec.X509EncodedKeyS
+ * RSA工具类
+public class Rsa {
+ public static final String SIGN_ALGORITHMS = &MD5WithRSA&;
+ public static String sign(String content, String privateKey) {
String charset = &utf-8&;
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
Base64.decode(privateKey));
KeyFactory keyf = KeyFactory.getInstance(&RSA&);
PrivateKey priKey = keyf.generatePrivate(priPKCS8);
java.security.Signature signature = java.security.Signature
.getInstance(SIGN_ALGORITHMS);
signature.initSign(priKey);
signature.update(content.getBytes(charset));
byte[] signed = signature.sign();
return Base64.encode(signed);
} catch (Exception e) {
e.printStackTrace();
+ public static boolean doCheck(String content, String sign, String publicKey) {
KeyFactory keyFactory = KeyFactory.getInstance(&RSA&);
byte[] encodedKey = Base64.decode(publicKey);
PublicKey pubKey = keyFactory
.generatePublic(new X509EncodedKeySpec(encodedKey));
java.security.Signature signature = java.security.Signature
.getInstance(SIGN_ALGORITHMS);
signature.initVerify(pubKey);
signature.update(content.getBytes(&utf-8&));
boolean bverify = signature.verify(Base64.decode(sign));
} catch (Exception e) {
e.printStackTrace();
Index: lianlian/utils/BaseHelper.java
===================================================================
--- lianlian/utils/BaseHelper.java (revision 0)
+++ lianlian/utils/BaseHelper.java (revision 111)
@@ -0,0 +1,352 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import java.io.BufferedR
+import java.io.IOE
+import java.io.InputS
+import java.io.InputStreamR
+import java.lang.reflect.InvocationTargetE
+import java.lang.reflect.M
+import java.util.ArrayL
+import java.util.C
+import java.util.L
+import org.apache.http.NameValueP
+import org.apache.http.message.BasicNameValueP
+import org.json.JSONE
+import org.json.JSONO
+import android.app.A
+import android.app.AlertD
+import android.app.ProgressD
+import android.content.C
+import android.util.L
+ * 工具类
+public class BaseHelper{
public static final String PARAM_EQUAL = &=&;
public static final String PARAM_AND
* 流转字符串方法
* @param is
public static String convertStreamToString(InputStream is)
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line =
while ((line = reader.readLine()) != null)
sb.append(line);
} catch (IOException e)
e.printStackTrace();
is.close();
} catch (IOException e)
e.printStackTrace();
return sb.toString();
* 显示dialog
* @param context
* @param strTitle
* @param strText
* @param icon
public static void showDialog(Activity context, String strTitle,
String strText, int icon)
AlertDialog.Builder tDialog = new AlertDialog.Builder(context);
tDialog.setIcon(icon);
tDialog.setTitle(strTitle);
tDialog.setMessage(strText);
tDialog.setPositiveButton(&确定&, null);
tDialog.show();
} catch (Exception e)
* 打印信息
* @param tag
* @param info
public static void log(String tag, String info)
Log.i(tag, info);
* 获取权限
* @param permission
* @param path
public static void chmod(String permission, String path)
String command = &chmod & + permission + & & +
Runtime runtime = Runtime.getRuntime();
runtime.exec(command);
} catch (IOException e)
e.printStackTrace();
// show the progress bar.
* 显示进度条
* @param context
* @param title
* @param message
* @param indeterminate
* @param cancelable
public static ProgressDialog showProgress(Context context,
CharSequence title, CharSequence message, boolean indeterminate,
boolean cancelable)
ProgressDialog dialog = new ProgressDialog(context);
dialog.setTitle(title);
dialog.setMessage(message);
dialog.setIndeterminate(indeterminate);
dialog.setCancelable(false);
dialog.show();
* 字符串转json对象
* @param str
* @param split
public static JSONObject string2JSON(String str, String split)
JSONObject json = new JSONObject();
String[] arrStr = str.split(split);
for (int i = 0; i & arrStr. i++)
String[] arrKeyValue = arrStr[i].split(&=&);
json.put(arrKeyValue[0],
arrStr[i].substring(arrKeyValue[0].length() + 1));
catch (Exception e)
e.printStackTrace();
public static JSONObject string2JSON(String str)
return new JSONObject(str);
} catch (JSONException e)
e.printStackTrace();
return new JSONObject();
public static String toJSONString(Object obj)
JSONObject json = new JSONObject();
List&NameValuePair& list = bean2Parameters(obj);
for (NameValuePair nv : list)
json.put(nv.getName(), nv.getValue());
} catch (JSONException e)
e.printStackTrace();
return json.toString();
* 将bean转换成键值对列表
* @param bean
public static List&NameValuePair& bean2Parameters(Object bean)
if (bean == null)
List&NameValuePair& parameters = new ArrayList&NameValuePair&();
// 取得bean所有public 方法
Method[] Methods = bean.getClass().getMethods();
for (Method method : Methods)
if (method != null && method.getName().startsWith(&get&)
&& !method.getName().startsWith(&getClass&))
// 得到属性的类名
String value = &&;
// 得到属性值
String className = method.getReturnType().getSimpleName();
if (className.equalsIgnoreCase(&int&))
int val = 0;
val = (Integer) method.invoke(bean);
} catch (InvocationTargetException e)
Log.e(&InvocationTargetException&, e.getMessage(),
value = String.valueOf(val);
} else if (className.equalsIgnoreCase(&String&))
value = (String) method.invoke(bean);
} catch (InvocationTargetException e)
Log.e(&InvocationTargetException&, e.getMessage(),
if (value != null && value != &&)
// 添加参数
// 将方法名称转化为id,去除get,将方法首字母改为小写
String param = method.getName().replaceFirst(&get&, &&);
if (param.length() & 0)
String first = String.valueOf(param.charAt(0))
.toLowerCase();
param = first + param.substring(1);
parameters.add(new BasicNameValuePair(param, value));
} catch (IllegalArgumentException e)
Log.e(&IllegalArgumentException&, e.getMessage(), e);
} catch (IllegalAccessException e)
Log.e(&IllegalAccessException&, e.getMessage(), e);
* 对Object进行List&NameValuePair&转换后按key进行升序排序,以key=value&...形式返回
* @param list
public static String sortParam(Object order)
List&NameValuePair& list = bean2Parameters(order);
return sortParam(list);
* 对List&NameValuePair&按key进行升序排序,以key=value&...形式返回
* @param list
public static String sortParam(List&NameValuePair& list)
if (list == null)
Collections.sort(list, new Comparator&NameValuePair&(){
public int compare(NameValuePair lhs, NameValuePair rhs)
return lhs.getName().compareToIgnoreCase(rhs.getName());
StringBuffer sb = new StringBuffer();
for (NameValuePair nameVal : list)
if (null != nameVal.getValue() && !&&.equals(nameVal.getValue())
&& !nameVal.getName().equals(&id_type&)
&& !nameVal.getName().equals(&id_no&)
&& !nameVal.getName().equals(&acct_name&)
&& !nameVal.getName().equals(&flag_modify&)
&& !nameVal.getName().equals(&user_id&)
&& !nameVal.getName().equals(&no_agree&)
&& !nameVal.getName().equals(&card_no&)
&& !nameVal.getName().equals(&test_mode&))
sb.append(nameVal.getName());
sb.append(PARAM_EQUAL);
sb.append(nameVal.getValue());
sb.append(PARAM_AND);
String params = sb.toString();
if (sb.toString().endsWith(PARAM_AND))
params = sb.substring(0, sb.length() - 1);
Log.v(&待签名串&, params);
\ No newline at end of file
Index: lianlian/utils/Constants.java
===================================================================
--- lianlian/utils/Constants.java (revision 0)
+++ lianlian/utils/Constants.java (revision 111)
@@ -0,0 +1,41 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+public final class Constants {
+ public static final int BASE_ID = 0;
+ public static final int RQF_PAY = BASE_ID + 1;
+ public static final int RQF_INSTALL_CHECK = RQF_PAY + 1;
+ public static final String SERVER_URL = &.cn/secure_server/x.htm&;
+ public static final String PAY_PACKAGE = &com.yintong.secure&;
+ // 银通支付安全支付服务apk的名称,必须与assets目录下的apk名称一致
+ public static final String YT_PLUGIN_NAME = &SecurePay.apk&;
+ public static final String RET_CODE_SUCCESS = &0000&;// 0000 交易成功
+ public static final String RET_CODE_PROCESS = &2008&;// 2008 支付处理中
+ public static final String RESULT_PAY_SUCCESS = &SUCCESS&;
+ public static final String RESULT_PAY_PROCESSING = &PROCESSING&;
+ public static final String RESULT_PAY_FAILURE = &FAILURE&;
+ public static final String RESULT_PAY_REFUND = &REFUND&;
+class YTPayDefine {
+ public static final String IMEI = &imei&;
+ public static final String IMSI = &imsi&;
+ public static final String KEY = &key&;
+ public static final String USER_AGENT = &user_agent&;
+ public static final String VERSION = &version&;
+ public static final String DEVICE = &device&;
+ public static final String SID = &sid&;
+ public static final String PARTNER = &partner&;
+ public static final String TRANSCODE = &transcode&;
+ public static final String CHARSET = &charset&;
+ public static final String SIGN_TYPE = &sign_type&;
+ public static final String SIGN = &sign&;
+ public static final String URL = &URL&;
+ public static final String SPLIT = &&&;
+ public static final String ACTION = &action&;
+ public static final String ACTION_UPDATE = &update&;
+ public static final String DATA = &data&;
+ public static final String PLATFORM = &platform&;
Index: lianlian/utils/Md5Algorithm.java
===================================================================
--- lianlian/utils/Md5Algorithm.java (revision 0)
+++ lianlian/utils/Md5Algorithm.java (revision 111)
@@ -0,0 +1,103 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import java.io.UnsupportedEncodingE
+import java.security.MessageD
+import java.security.NoSuchAlgorithmE
+ * 32位MD5摘要算法
+ * @author shmily
下午02:34:45
+public class Md5Algorithm {
+ private static Md5A
+ private final static String[] hexDigits = { &0&, &1&, &2&, &3&, &4&, &5&,
&6&, &7&, &8&, &9&, &a&, &b&, &c&, &d&, &e&, &f& };
+ private Md5Algorithm(){
+ public static Md5Algorithm getInstance(){
if(null == instance)
return new Md5Algorithm();
* 转换字节数组为16进制字串
* @param b 字节数组
* @return 16进制字串
+ private String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i & b. i++) {
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
* 转换字节数组为高位字符串
* @param b 字节数组
+ private String byteToHexString(byte b) {
if (n & 0)
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
* MD5 摘要计算(byte[]).
* @param src byte[]
* @throws Exception
* @return String
+ public String md5Digest(byte[] src) {
// MD5 is 32 bit message digest
alg = MessageDigest.getInstance(&MD5&);
} catch (NoSuchAlgorithmException e) {
return byteArrayToHexString(alg.digest(src));
+ public static void main(String[] args) {
System.out.println(Md5Algorithm.getInstance().md5Digest(&111111&.getBytes(&iso8859-1&)));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
+ public String sign(String content, String md5Key) {
content = content + &&key=& + md5K
return md5Digest(content.getBytes(&UTF-8&));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
+ public boolean doCheck(String content, String sign, String md5Key) {
content = content + &&key=& + md5K
return md5Digest(content.getBytes(&UTF-8&)).equals(sign);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Index: lianlian/utils/MobileSecurePayer.java
===================================================================
--- lianlian/utils/MobileSecurePayer.java (revision 0)
+++ lianlian/utils/MobileSecurePayer.java (revision 111)
@@ -0,0 +1,203 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import org.json.JSONE
+import org.json.JSONO
+import android.app.A
+import ponentN
+import android.content.C
+import android.content.I
+import android.content.ServiceC
+import android.os.B
+import android.os.H
+import android.os.IB
+import android.os.M
+import android.os.RemoteE
+import android.util.L
+import com.yintong.android.app.IPayS
+import com.yintong.android.app.IRemoteServiceC
+import com.yintong.secure.service.PayS
+public class MobileSecurePayer {
+ Integer lock = 0;
+ IPayService payService =
+ boolean mbPaying =
+ static final String TAG = &MobileSecurePayer&;
+ Activity mActivity =
+ // 和安全支付服务建立连接
+ private ServiceConnection mSecurePayConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// wake up the binder to continue.
// 获得通信通道
synchronized (lock) {
payService = IPayService.Stub.asInterface(service);
lock.notify();
} catch (Exception e) {
Log.d(TAG, e.getLocalizedMessage());
public void onServiceDisconnected(ComponentName className) {
payService =
* 向银通支付发送支付请求
* @param strOrderInfo
* @param callback
回调handler
* @param myWhat
* @param activity
目标activity
+ public boolean pay(String strOrderInfo, final Handler callback,
final int myWhat, final Activity activity,boolean isTest) {
if (mbPaying)
mbPaying =
if (isTest) {
strOrderInfo = new JSONObject(strOrderInfo).put(&test_mode&, &1&).toString();
} catch (JSONException e) {
e.printStackTrace();
mActivity =
// bind the service.
// 绑定服务
if (payService == null) {
// 绑定安全支付服务需要获取上下文环境,
// 如果绑定不成功使用mActivity.getApplicationContext().bindService
// 解绑时同理
mActivity.getApplicationContext().bindService(
new Intent(activity,PayService.class),
mSecurePayConnection, Context.BIND_AUTO_CREATE);
// else ok.
final String
// 实例一个线程来进行支付
new Thread(new Runnable() {
public void run() {
// wait for the service bind operation to completely
// finished.
// Note: this is important,otherwise the next
// payService.Pay()
// will fail.
// 等待安全支付服务绑定操作结束
// 注意:这里很重要,否则payService.pay()方法会失败
synchronized (lock) {
if (payService == null)
lock.wait();
// register a Callback for the service.
// 为安全支付服务注册一个回调
payService.registerCallback(mCallback);
// call the MobileSecurePay service.
// 调用安全支付服务的pay方法
String strRet = payService.pay(payinfo);
BaseHelper.log(TAG, &服务端支付结果:& + strRet);
// set the flag to indicate that we have finished.
// unregister the Callback, and unbind the service.
// 将mbPaying置为false,表示支付结束
// 移除回调的注册,解绑安全支付服务
mbPaying =
payService.unregisterCallback(mCallback);
mActivity.getApplicationContext().unbindService(
mSecurePayConnection);
// send the result back to caller.
// 发送交易结果
Message msg = new Message();
msg.what = myW
msg.obj = strR
callback.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
// send the result back to caller.
// 发送交易结果
Message msg = new Message();
msg.what = myW
msg.obj = e.toString();
callback.sendMessage(msg);
}).start();
* This implementation is used to receive callbacks from the remote service.
* 实现安全支付的回调
+ private IRemoteServiceCallback mCallback = new IRemoteServiceCallback.Stub() {
* This is called by the remote service regularly to tell us about new
* values. Note that IPC calls are dispatched through a thread pool
* running in each process, so the code executing here will NOT be
* running in our main thread like most other things -- so, to update
* the UI, we need to use a Handler to hop over there. 通过IPC机制启动安全支付服务
public void startActivity(String packageName, String className,
int iCallingPid, Bundle bundle) throws RemoteException {
Intent intent = new Intent(Intent.ACTION_MAIN, null);
if (bundle == null)
bundle = new Bundle();
// else ok.
bundle.putInt(&CallingPid&, iCallingPid);
intent.putExtras(bundle);
} catch (Exception e) {
e.printStackTrace();
intent.setClassName(packageName, className);
mActivity.startActivity(intent);
* when the msp loading dialog gone, call back this method.
public boolean isHideLoadingScreen() throws RemoteException {
* when the current trade is finished or cancelled, call back this
public void payEnd(boolean arg0, String arg1) throws RemoteException {
Index: lianlian/env/EnvConstants.java
===================================================================
--- lianlian/env/EnvConstants.java (revision 0)
+++ lianlian/env/EnvConstants.java (revision 111)
@@ -0,0 +1,23 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+public class EnvConstants {
+ private EnvConstants() {
* TODO 商户号,商户MD5 key 配置。本测试Demo里的“PARTNER”;强烈建议将私钥配置到服务器上,以免泄露。“MD5_KEY”字段均为测试字段。正式接入需要填写商户自己的字段
public static final String PARTNER = &015508&;
public static final String MD5_KEY = &caidouzi203&;
//=======================采用RSA签名的,请修&RSA_PRIVATE&字段============================//
// 商户(RSA)私钥 TODO 强烈建议将私钥配置到服务器上,否则有安全隐患
public static final String RSA_PRIVATE =
&MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOilN4tR7HpNYvSBra/DzebemoAiGtGeaxa+qebx/O2YAdUFPI+xTKTX2ETyqSzGfbxXpmSax7tXOdoa3uyaFnhKRGRvLdq1kTSTu7q5s6gTryxVH2m62Py8Pw0sKcuuV0CxtxkrxUzGQN+QSxf+TyNAv5rYi/ayvsDgWdB3cRqbAgMBAAECgYEAj02d/jqTcO6UQspSY484GLsL7luTq4Vqr5L4cyKiSvQ0RLQ6DsUG0g+Gz0muPb9ymf5fp17UIyjioN+ma5WquncHGm6ElIuRv2jYbGOnl9q2cMyNsAZCiSWfR++op+6UZbzpoNDiYzeKbNUz6L1fJjzCt52w/RbkDncJd2mVDRkCQQD/Uz3QnrWfCeWmBbsAZVoM57n01k7hyLWmDMYoKh8vnzKjrWScDkaQ6qGTbPVL3x0EBoxgb/smnT6/A5XyB9bvAkEA6UKhP1KLi/ImaLFUgLvEvmbUrpzY2I1+jgdsoj9Bm4a8K+KROsnNAIvRsKNgJPWd64uuQntUFPKkcyfBV1MXFQJBAJGs3Mf6xYVIEE75VgiTyx0x2VdoLvmDmqBzCVxBLCnvmuToOU8QlhJ4zFdhA1OWqOdzFQSw34rYjMRPN24wKuECQEqpYhVzpWkA9BxUjli6QUo0feT6HUqLV7O8WqBAIQ7X/IkLdzLa/vwqxM6GLLMHzylixz9OXGZsGAkn83GxDdUCQA9+pQOitY0WranUHeZFKWAHZszSjtbe6wDAdiKdXCfig0/rOdxAODCbQrQs7PYy1ed8DuVQlHPwRGtokVGHATU=&;
// 银通支付(RSA)公钥,这个是银通的公钥,不需要修改,如果是RSA签名的,可以用来本地验签,MD5不需要关注
public static final String RSA_YT_PUBLIC =
&MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSS/DiwdCf/aZsxxcacDnooGph3d2JOj5GXWi+q3gznZauZjkNP8SKl3J2liP0O6rU/Y/29+IUe+GTMhMOFJuZm1htAtKiu5ekW0GlBMWxf4FPkYlQkPE0FtaoMP3gYfh+OwI+fIRrpW3ySn3mScnc6Z700nU/VYrRkfcSCbSnRwIDAQAB&;
Index: lianlian/env/LianLianPayPlugin.java
===================================================================
--- lianlian/env/LianLianPayPlugin.java (revision 0)
+++ lianlian/env/LianLianPayPlugin.java (revision 111)
@@ -0,0 +1,293 @@
+package com.caidouzi.lotterynew.pay.lianlian.
+import java.text.SimpleDateF
+import java.util.D
+import java.util.L
+import org.json.JSONE
+import org.json.JSONO
+import android.os.H
+import android.os.M
+import android.util.L
+import com.android.volley.Response.L
+import com.caidouzi.lotterynew.base.BaseA
+import com.caidouzi.lotterynew.base.BaseActivity.TipsErrorL
+import com.caidouzi.lotterynew.pay.PayCallB
+import com.caidouzi.lotterynew.pay.lianlian.activity.StandA
+import com.caidouzi.lotterynew.pay.lianlian.utils.BaseH
+import com.caidouzi.lotterynew.pay.lianlian.utils.C
+import com.caidouzi.lotterynew.pay.lianlian.utils.Md5A
+import com.caidouzi.lotterynew.pay.lianlian.utils.MobileSecureP
+import com.caidouzi.lotterynew.pay.lianlian.utils.PayO
+import com.caidouzi.lotterynew.pay.lianlian.utils.ResultC
+import com.caidouzi.lotterynew.service.CaiPiaoS
+import com.caidouzi.lotterynew.tools.UMDATA;
+import com.caidouzi.lotterynew.utils.L
+public class LianLianPayPlugin {
+ private PayCallBack payCallB
+ private String userId, idCard, name, money, bankNo, agree_
+ private BaseActivity mC
+ private CaiPiaoS
+ private TipsErrorL
+ private S
+ private String Z
+ public LianLianPayPlugin(String userId, String idCard, String name, String money, String bankNo, String agree_no,String Zctime, BaseActivity mContext) {
this.userId = userId;
this.idCard = idC
this.name =
this.money =
this.bankNo = bankNo;
this.agree_no = agree_
this.mContext = mC
this.Zctime = Z
service = mContext.getService();
l = mContext.getDefaultErrorCallBack();
+ public PayCallBack getPayCallBack() {
return payCallB
+ public void setPayCallBack(PayCallBack payCallBack) {
this.payCallBack = payCallB
+ private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
String strRet = (String) msg.
switch (msg.what) {
case Constants.RQF_PAY: {
JSONObject objContent = BaseHelper.string2JSON(strRet);
String retCode = objContent.optString(&ret_code&);
String retMsg = objContent.optString(&ret_msg&);
// 先判断状态码,状态码为 成功或处理中 的需要 验签
if (Constants.RET_CODE_SUCCESS.equals(retCode) || Constants.RET_CODE_PROCESS.equals(retCode)) {
ResultChecker resultChecker = new ResultChecker(strRet);
* 支付结果校验,注意校验分为MD5和RSA两种,是根据支付时的签名方式来的。 TODO ResultChecker
* 内部配置了签名key,请注意修改。另外如果是使用的MD5验签,MD5的key建议放到服务器
* ,这样会再次请求服务器.
* 所以如果使用MD5的可以直接把SDK支付返回结果的校验去掉。前端直接提示SDK的结果就可以了
* 。后台会以我们异步通知为依据的。RSA验签可以将RSA_YT_PUBLIC银通的公钥配置到客户端。
int retVal = resultChecker.checkSign();
if (retVal == ResultChecker.RESULT_CHECK_SIGN_SUCCEED) {// 验签成功。验签成功后再判断
// TODO 卡前置模式返回的银行卡绑定协议号,用来下次支付时使用,此处仅作为示例使用。正式接入时去掉
// if (pay_type_flag == 1) {
// TextView tv_agree_no = (TextView)
// findViewById(R.id.tv_agree_no);
// tv_agree_no.setVisibility(View.VISIBLE);
// tv_agree_no.setText(objContent.optString(&agreementno&,
// DefaultSP.getInstance().writeString(&agreementno&,
// objContent.optString(&agreementno&, &&));
String resulPay = objContent.optString(&result_pay&);
if (Constants.RESULT_PAY_SUCCESS.equalsIgnoreCase(resulPay) || Constants.RESULT_PAY_PROCESSING.equalsIgnoreCase(resulPay)) {
//连连支付成功统计
UMDATA.uploadRechargeData(mContext, UMDATA.TYPE_RECHARGE_LIANLIAN, money);
// TODO 支付成功后续处理
LianLianPayPlugin.this.agree_no = objContent.optString(&agreementno&, &&);
if (payCallBack != null) {
payCallBack.onSuccess(no_agree);
updateOrder(resulPay);
// String noid = objContent.optString(&no_order&,
// BaseHelper.showDialog(StandActivity.this, &提示&,
// retMsg + &,交易状态码:& + retCode,
// android.R.drawable.ic_dialog_alert);
if (payCallBack != null) {
payCallBack.onFailure(retMsg);
// BaseHelper.showDialog(StandActivity.this, &提示&,
// &您的订单信息已被非法篡改。&, android.R.drawable.ic_dialog_alert);
if (payCallBack != null) {
payCallBack.onFailure(retMsg);
// BaseHelper.showDialog(StandActivity.this, &提示&, retMsg +
// &,交易状态码:& + retCode, android.R.drawable.ic_dialog_alert);
if (payCallBack != null) {
payCallBack.onFailure(retMsg);
super.handleMessage(msg);
+ private PayOrder constructPreCardPayOrder(String userId, String idCard, String name, String money, String bankNo, String agree_no) {
SimpleDateFormat dataFormat = new SimpleDateFormat(&yyyyMMddHHmmss&, Locale.getDefault());
Date date = new Date();
String timeString = dataFormat.format(date);
PayOrder order = new PayOrder();
// TODO busi_partner 是指商户的业务类型,&101001&为虚拟商品销售,详情请参考接口说明书
order.setBusi_partner(&101001&);
// TODO 商户订单,Demo采用时间戳模拟订单号
order.setNo_order(noid);
order.setDt_order(timeString);
order.setName_goods(&彩豆子充值&);
order.setNotify_url(&/ThirdParty/alipay/notify_url2&);
order.setSign_type(PayOrder.SIGN_TYPE_MD5);
order.setValid_order(&100&);
//服务器添加
String info_order = &用户彩豆子充值银行卡为:& + bankNo + &:& + userId;
order.setInfo_order(info_order);
order.setUser_id(userId);
order.setId_no(idCard);
order.setAcct_name(name);
order.setMoney_order(money);
// 银行卡卡号,该卡首次支付时必填
order.setCard_no(bankNo);
// 银行卡历次支付时填写,可以查询得到,协议号匹配会进入SDK,
order.setNo_agree(agree_no);
order.setFlag_modify(&1&); // 可修改用户信息
// int id = ((RadioGroup) findView
// ById(R.id.flag_modify_group)).getCheckedRadioButtonId();
// if (id == R.id.flag_modify_0) {
// order.setFlag_modify(&0&);
// } else if (id == R.id.flag_modify_1) {
// order.setFlag_modify(&1&);
// TODO 风险控制参数,没必要传入的,请不要设置这个条目,
order.setRisk_item(constructRiskItem());
String sign = &&;
// TODO 商户号
order.setOid_partner(EnvConstants.PARTNER);
// TODO 对签名原串进行排序,并剔除不需要签名的串。
String content = BaseHelper.sortParam(order);
// TODO MD5 签名方式, 签名方式包括两种,一种是MD5,一种是RSA 这个在商户站管理里有对验签方式和签名Key的配置。
sign = Md5Algorithm.getInstance().sign(content, EnvConstants.MD5_KEY);
// RSA 签名方式
// sign = Rsa.sign(content, EnvConstants.RSA_PRIVATE);
order.setSign(sign);
* 支付有三步
* 1、增加订单
* 2、服务器返回订单号后调用连连插件
* 3、连连支付成功再调用服务器接口更新订单状态
+ public void pay() {
mContext.showLoadingState(&正在生成订单...&);
addOrder();
+ private void addOrder() {
service.doAddBankRecord(bankNo, money, new Listener&String&() {
public void onResponse(String response) {
mContext.stopLoadingState();
JSONObject jsonObject = new JSONObject(response);
int ret_code = jsonObject.optInt(&ret_code&);
String msg = jsonObject.optString(&ret_msg&);
if (ret_code == 0) {
noid = jsonObject.optString(&noid&);
PayOrder order = constructPreCardPayOrder(userId, idCard, name, money, bankNo, agree_no);
String content4Pay = BaseHelper.toJSONString(order);
// 关键 content4Pay
// 用于提交到支付SDK的订单支付串,如遇到签名错误的情况,请将该信息帖给我们的技术支持
Log.i(StandActivity.class.getSimpleName(), content4Pay);
MobileSecurePayer msp = new MobileSecurePayer();
boolean bRet = msp.pay(content4Pay, mHandler, Constants.RQF_PAY, mContext, false);
//ToastManager.showShortToast(mContext, msg);
} catch (JSONException e) {
e.printStackTrace();
+ private void updateOrder(final String lianlianMsg) {
service.doUpdateBankRecord(noid, agree_no, money, bankNo, new Listener&String&() {
public void onResponse(String response) {
Logger.i(&LianLianPay&, response);
JSONObject jsonObject = new JSONObject(response);
int ret_code = jsonObject.optInt(&ret_code&);
String msg = jsonObject.optString(&ret_msg&);
if(ret_code == 0){
if (payCallBack != null) {
payCallBack.onSuccess(lianlianMsg);
if (payCallBack != null) {
payCallBack.onFailure(msg);
//ToastManager.showShortToast(mContext, msg);
} catch (JSONException e) {
e.printStackTrace();
+ private String constructRiskItem() {
JSONObject mRiskItem = new JSONObject();
mRiskItem.put(&user_info_bind_phone&, &&);
SimpleDateFormat format1 = new SimpleDateFormat(&yyyy/MM/dd hh:mm:ss&);
SimpleDateFormat format2 = new SimpleDateFormat(&YYYYMMDDH24MISS&);
Date date = format1.parse(this.Zctime);
mRiskItem.put(&user_info_dt_register&, format2.format(date));
} catch (ParseException e) {
e.printStackTrace();
mRiskItem.put(&user_info_dt_register&, this.Zctime);
mRiskItem.put(&user_info_mercht_userno&, this.userId);
mRiskItem.put(&user_info_full_name&, this.name);
mRiskItem.put(&user_info_id_no&, this.idCard);
mRiskItem.put(&frms_ware_category&, &1007&);
String imei =((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
if(!TextUtils.isEmpty(imei) && !&00&.equals(imei))
mRiskItem.put(&request_imei&, imei);
} catch (JSONException e) {
e.printStackTrace();
return mRiskItem.toString();
(C)&&2013&&Alibaba&&Inc.&&All&&rights&&resvered.
Powered by

我要回帖

更多关于 子窗口调用父窗口方法 的文章

 

随机推荐